Cod sursa(job #638042)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 20 noiembrie 2011 18:19:57
Problema DreptPal Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 0.92 kb
#include<cstdio>
#define minim(a,b) a<b?a:b
#define maxim(a,b) a>b?a:b
void read(),solve();
int i,j,n,m,cnt,A[1010][1010],C[1010][1010],st,dr,sol,k;
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("dreptpal.in","r",stdin);
	freopen("dreptpal.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%d",&A[i][j]);
}
void solve()
{
	for(i=1;i<=n;i++)
		for(j=2;j<m;j++)
		{
			C[i][j]=1;
			for(st=j-1,dr=j+1;st>=1&&dr<=m;st--,dr++)if(A[i][st]==A[i][dr])C[i][j]+=2; else break;
		}
	for(j=2;j<m;j++)
		for(i=2;i<n;i++)
		{
			if(i==2){st=i-1;dr=i+1;}
			dr=maxim(dr,i+1);
			if(C[i-1][j]>=C[i][j]){for(;C[st][j]>=C[i][j]&&st>=1;st--);if(C[st][j]<C[i][j])st++;} else st=i;
			if(C[i+1][j]>=C[i][j]){for(;C[dr][j]>=C[i][j]&&dr<=n;dr++);if(C[dr][j]<C[i][j])dr--;} else dr=i;
			if(sol<(dr-st+1)*C[i][j])sol=(dr-st+1)*C[i][j];
		}
	printf("%d\n",sol);
}