Pagini recente » Cod sursa (job #758259) | Cod sursa (job #839967) | Cod sursa (job #954490) | Cod sursa (job #2020049) | Cod sursa (job #2017126)
#include<fstream>
using namespace std;
ifstream fin("dreptpal.in");
ofstream fout("dreptpal.out");
int Long_pal[1005][1005], a[1005][1005], C, R, n, m, st[2][1005], sol;
int main(){
fin >> n >> m;
for( int i = 1; i <= n; i++ ){
for( int j = 1; j <= m; j++ ){
fin >> a[i][j];
}
a[i][0] = -1;
a[i][m + 1] = -2;
}
for( int i = 1; i <= n; i++ ){
C = R = 0;
for( int j = 1; j <= m; j++ ){
int mirr_poz = C * 2 - j;
if( j <= R )
Long_pal[i][j] = min( Long_pal[i][mirr_poz], R - j + 1 );
else
Long_pal[i][j] = 1;
while( j - Long_pal[i][j] >= 1 && j + Long_pal[i][j] <= m && a[i][ j - Long_pal[i][j] ] == a[i][ j + Long_pal[i][j] ] )
Long_pal[i][j]++;
if( j + Long_pal[i][j] - 1 > R ){
C = j;
R = j + Long_pal[i][j] - 1;
}
}
}
sol = 0;
for( int j = 1; j <= m; j++ ){
int maxim = 0;
int k = 0;
for( int i = 1; i <= n; i++ ){
if( Long_pal[i][j] > st[0][k] ){
st[0][++k] = Long_pal[i][j];
st[1][k] = i;
}else{
int poz = 0;
while( st[0][k] >= Long_pal[i][j] && k > 0 ){
if( maxim < ( st[0][k] * 2 - 1 ) * ( i - st[1][k] ) )
maxim = ( st[0][k] * 2 - 1 ) * ( i - st[1][k] );
poz = st[1][k];
k--;
}
if( Long_pal[i][j] > 0 ){
st[0][++k] = Long_pal[i][j];
st[1][k] = poz;
}
}
}
while( k > 0 ){
if( maxim < ( st[0][k] * 2 - 1 ) * ( n + 1 - st[1][k] ) )
maxim = ( st[0][k] * 2 - 1 ) * ( n + 1 - st[1][k] );
k--;
}
sol = max( sol, maxim );
}
fout << sol << "\n";
return 0;
}