Cod sursa(job #636959)

Utilizator nandoLicker Nandor nando Data 20 noiembrie 2011 08:11:56
Problema DreptPal Scor 50
Compilator cpp Status done
Runda .com 2011 Marime 1.12 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

#define MAXN 1010

inline int max(int i, int j)
{
	return i > j ? i : j;	
}

FILE* fin = fopen("dreptpal.in", "r");
FILE* fout = fopen("dreptpal.out", "w");

int n, m, mat[MAXN][MAXN], pali[MAXN][MAXN];

int main()
{
	fscanf (fin, "%d %d\n", &n, &m);
	
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			fscanf (fin, "%d ", &mat[i][j]);	
		}
	}
	
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			while (j - pali[i][j] >= 1 && j + pali[i][j] <= m && 
				   mat[i][j - pali[i][j]] == mat[i][j + pali[i][j]]) {
				++pali[i][j];			
			}
			pali[i][j] = (pali[i][j] << 1) -  1;
		}
	}
	
	int maxpali = 0;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			int up = 0, down = 0;
			
			while (pali[i - up][j] >= pali[i][j]) {
				++up;	
			}		
			while (pali[i + down][j] >= pali[i][j]) {
				++down;	
			}
			
			maxpali = max(maxpali, (up + down - 1) * pali[i][j]);
		}	
	}
	
	fprintf (fout, "%d\n", maxpali);
	
	fclose(fin);
	fclose(fout);
	return 0;	
}