Cod sursa(job #636961)

Utilizator nandoLicker Nandor nando Data 20 noiembrie 2011 08:17:12
Problema DreptPal Scor 50
Compilator cpp Status done
Runda .com 2011 Marime 1.52 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;	
}
//<parsing>
FILE* fin = fopen("dreptpal.in", "r");
const unsigned maxb = 8192;
char buf[maxb];
unsigned ptr = maxb;

inline unsigned getInt()
{
	while(buf[ptr] < '0' || '9' < buf[ptr]) {
		if(++ptr >= maxb) {
			fread(buf, maxb, 1, fin), ptr=0;
		}
	}
	
	unsigned nr = 0;
	while('0' <= buf[ptr] && buf[ptr] <= '9') {
		nr = nr * 10 + buf[ptr] - '0';
		
		if(++ptr >= maxb) {
			fread(buf, maxb, 1, fin), ptr=0;
		}
	}
	return nr;
}
//</parsing>

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

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

int main()
{
	n = getInt(), m = getInt();
	
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			mat[i][j] = getInt();
		}
	}
	
	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;	
}