Pagini recente » Cod sursa (job #1951884) | Monitorul de evaluare | Cod sursa (job #2057201) | Istoria paginii runda/sim02/clasament | Cod sursa (job #2009621)
#include<bits/stdc++.h>
#define maxN 1055
using namespace std;
int n,m;
int a[maxN][maxN],odd[maxN][maxN],s[maxN],vf,dr[maxN],st[maxN],k,sol;
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=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
for(int i=1;i<=n;i++)
{
int l=0;
int r=0;
k=0;
for(int j=0;j<m;j++)
{
if(j>r) k=1;
else k=min(odd[i][l+r-j],r-j+1);
while((j+k)<m && (j-k)>=0 && a[i][j+k]==a[i][j-k]) k++;
// k--;
odd[i][j]=k;
k--;
if((i+k)>r)
{
r=i+k;
l=i-k;
}
}
}
for(int j=0;j<m;j++)
{
vf=0;
for(int i=1;i<=n;i++)
{
dr[i]=n;
st[i]=1;
}
for(int i=1;i<=n;i++)
{
while(vf && odd[s[vf]][j]>odd[i][j])
{
dr[s[vf]]=i-1;
vf--;
}
s[++vf]=i;
}
vf=0;
for(int i=n;i>=1;i--)
{
while(vf && odd[s[vf]][j]>odd[i][j])
{
st[s[vf]]=i+1;
vf--;
}
s[++vf]=i;
}
for(int i=1;i<=n;i++)
sol=max(sol,(2*odd[i][j]-1)*(dr[i]-st[i]+1));
}
printf("%d\n",sol);
return 0;
}