Pagini recente » Cod sursa (job #1608092) | Cod sursa (job #2050846) | Cod sursa (job #2106648) | Cod sursa (job #1415856) | Cod sursa (job #1346633)
#include<stdio.h>
int p[1005][1005],a[1005][1005],i,j,n,m,k,sus[1005],jos[1005],st[1005],nr,sol;
void extinde (int q)
{
while(q+p[i][q]+1<=m&&q-p[i][q]-1>0&&a[i][q+p[i][q]+1]==a[i][q-p[i][q]-1])
p[i][q]++;
}
int max(int a, int b)
{
if(a>b)
return a;
return b;
}
int main()
{
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]);
for(i=1;i<=n;i++)
{
p[i][1]=0;
k=1;
for(j=2;j<=m;j++)
{
if(p[i][k]+k<j)
extinde(j);
else
{
if(p[i][k]+k<=j+p[i][2*k-j])
{
p[i][j]=p[i][2*k-j];
extinde(j);
}
else
p[i][j]=p[i][2*k-j];
}
}
}
for(j=1;j<=m;j++)
{
nr=0;
for(i=1;i<=n;i++)
{
while(nr>0&&p[st[i]][j]>=p[i][j])
nr--;
sus[i]=st[nr];
nr++;
st[nr]=i;
}
nr=0;
st[0]=n+1;
for(i=n;i>=1;i--)
{
while(nr>0&&p[st[i]][j]>=p[i][j])
nr--;
jos[i]=st[nr];
nr++;
st[nr]=i;
}
for(i=1;i<=n;i++)
sol=max(sol,(jos[i]-sus[i]-1)*(p[i][j]*2+1));
}
printf("%d",sol);
return 0;
}