Pagini recente » Cod sursa (job #2038855) | Cod sursa (job #323837) | Cod sursa (job #1194248) | Cod sursa (job #2452120)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("dreptpal.in");
ofstream out("dreptpal.out");
const int dim = 1005;
int n,m,mat[dim][dim],len[dim][2*dim+1],v[2*dim+1],h[dim],stiva[dim],st[dim],dr[dim],vf,maxi = -1,lenmax;
void FaLinie(int x)
{
int aux = 0;
v[0] = '$';
for (int j=1; j<=m; j++)
{
v[++aux] = '$';
v[++aux] = mat[x][j];
}
v[++aux] = '$';
int c = 0,r = 0;
for (int j=1; j<=2*m+1; j++)
{
if (j < r)
{
len[x][j] = min(r-j , len[x][2*c-j]);
}
while (v[j-len[x][j] - 1] == v[j + len[x][j] + 1])
{
len[x][j]++;
}
if (j + len[x][j] > r)
{
r = j+len[x][j];
c = j;
}
}
}
void MaxDrpt(int col)
{
for (int i=1; i<=n; i++)
{
h[i] = (len[i][2*col]+1)/2;
}
vf = 0;
stiva[vf] = 0;
for (int i=1; i<=n; i++)
{
while (vf > 0 && h[i] <= h[stiva[vf]])
{
vf--;
}
st[i] = stiva[vf];
stiva[++vf] = i;
}
vf = 0;
stiva[vf] = n+1;
for (int i=n; i>=1; i --)
{
while (vf > 0 && h[i] < h[stiva[vf]])
{
vf--;
}
dr[i] = stiva[vf];
stiva[++vf] = i;
}
for (int i=1; i<=n; i++)
{
if (maxi < h[i] * (dr[i] - st[i] - 1))
{
maxi = h[i] * (dr[i] - st[i] - 1);
lenmax = (dr[i] - st[i]-1);
}
}
}
int main()
{
in >> n >> m;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
in >> mat[i][j];
}
}
for (int i=1; i<=n; i++)
{
FaLinie(i);
}
for (int j=1; j<=m; j++)
{
MaxDrpt(j);
}
out << 2*maxi - lenmax;
return 0;
}