Cod sursa(job #636428)

Utilizator alexdmotocMotoc Alexandru alexdmotoc Data 19 noiembrie 2011 20:02:55
Problema DreptPal Scor 30
Compilator cpp Status done
Runda .com 2011 Marime 1.48 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define maxN 1005

int N , M , aux1 , aux2 , maxi = 0 , x[3] , diml = 0 , dimc = 0;
long long a[maxN][maxN];

struct linii
{
	int x , y;
}
li[6000005];

struct coloane
{
	int x , y;
}
c[300005];


void retine (int D)
{
	if (D == N)
	{
		++diml;
		
		li[diml].x = x[1];
		li[diml].y = x[2];
	}
	
	else 
		if ((x[2] - x[1] + 1) % 2 != 0)
		{
			++dimc;
			
			c[dimc].x = x[1];
			c[dimc].y = x[2];
		}
}
void back (int k , int D)
{
	for (int i = 1 ; i <= D ; ++i)
	{
		x[k] = i;
		
		if (x[k] > x[k - 1])
		{
			if (k == 2)
				retine(D);
			
			else back (k + 1 , D);
		}
		
	}
}
int main ()
{
	freopen ("dreptpal.in" , "r" , stdin);
	freopen ("dreptpal.out" , "w" , stdout);
	
	scanf ("%d %d" , &N , &M);
	
	for (int i = 1 ; i <= N ; ++i)
		for (int j = 1 ; j <= M ; ++j)
			scanf ("%lld" , &a[i][j]);
		
	back (1 , N);
	
	back (1 , M);
	
	bool ok;
	
	for (int p = 1 ; p <= diml ; ++p)
		for (int q = 1 ; q <= dimc ; ++q)
		{
			ok = 1;
			
			for (int i = li[p].x ; i <= li[p].y && ok ; ++i)
				for (int j = c[q].x ; j <= (c[q].x + c[q].y) / 2 ; ++j)
					if (a[i][j] != a[i][c[q].y - (j - c[q].x + 1) + 1])
					{
						ok = 0;
						break;
					}
					
			if (ok)
			{
				aux1 = li[p].y - li[p].x + 1;
				aux2 = c[q].y - c[q].x + 1;

				if (aux1 * aux2 > maxi)
					maxi = aux1 * aux2;
		
			}
			
		}
	
	printf ("%d" , maxi);
	
	return 0;
}