Pagini recente » Cod sursa (job #553192) | Cod sursa (job #3184042) | Cod sursa (job #1049702) | Cod sursa (job #2292976) | Cod sursa (job #1003525)
#include <fstream>
#include <stack>
using namespace std;
int mat[1005][1005],man[1005][1005];
int sus[1005][1005];
stack<int> stiva;
int main()
{
ifstream cin("dreptpal.in");
ofstream cout("dreptpal.out");
int centru,dif,maximul=-1,jos;
int n=0,m=0,i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>mat[i][j];
for(i=1;i<=n;i++)
{
centru=0;
for(j=1;j<=m;j++)
{
if((centru+man[i][centru])<j)
dif=1;
else if(((centru<<1)-j-man[i][(centru<<1)-j])>(centru-man[i][centru]))
{
man[i][j]=man[i][(centru<<1)-j];
continue;
}
else
dif=(centru<<1)-j-(centru-man[i][centru])+1;
for(;((j-dif)>=1) && ((j+dif)<=m) && dif<m;dif++)
if(mat[i][j-dif]!=mat[i][j+dif])
break;
man[i][j]=dif-1;
if((centru+man[i][centru])<(j+man[i][j]))
centru=j;
}
}
int varf;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
while(!stiva.empty())
if(man[stiva.top()][i]>=man[j][i])
stiva.pop();
else
break;
if(stiva.empty())
varf=0;
else
varf=stiva.top();
stiva.push(j);
sus[j][i]=(j-varf)*((man[j][i]<<1)+1);
}
while(!stiva.empty())
stiva.pop();
for(j=n;j>=1;j--)
{
while(!stiva.empty())
if(man[stiva.top()][i]>=man[j][i])
stiva.pop();
else
break;
if(stiva.empty())
varf=n+1;
else
varf=stiva.top();
stiva.push(j);
jos=(varf-j-1)*((man[j][i]<<1)+1)+sus[j][i];
if(jos>maximul)
maximul=jos;
}
while(!stiva.empty())
stiva.pop();
}
cout<<maximul<<'\n';
cin.close();
cout.close();
return 0;
}