#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
/*ashione 2012-4-24
最大子矩阵变形,枚举a,b,c即可。
l,r的最大距离操作参照hdu1505.
*/
#define MAXN 1005
char str[MAXN][MAXN];
char fun[]={'a','b','c','w','x','y','z'};
int d[8][4]={{1,0,0},{0,1,0},{0,0,1},{1,1,0},{0,1,1},{1,0,1},{1,1,1}};
int num[2][4][MAXN],r[MAXN],l[MAXN];
int main(){
int n,m,i,j,k,t;
while(~scanf("%d %d",&n,&m)){
for(i=1;i<=n;i++)
scanf("%s",str[i]+1);
int answer=0;
memset(num,0,sizeof(num));
for(i=1;i<=n;i++){
int p=i&1;
for(j=1;j<=m;j++){
for(k=0;k<7;k++){
if(str[i][j] == fun[k]){
for(t=0;t<3;t++){
if(d[k][t])
num[p][t][j]=num[!p][t][j]+1;
else
num[p][t][j]=0;
}
break;
}
}
}
for(k=0;k<3;k++){
for(t=1;t<=m;t++)
l[t]= r[t]=t;
for(j=1;j<=m;j++)
{
while(l[j]-1>=1 && num[p][k][l[j]-1]>=num[p][k][j])
l[j]=l[l[j]-1];
}
for(j=m;j>=1;j--)
{
while(r[j]+1<=m && num[p][k][r[j]+1]>=num[p][k][j])
r[j]=r[r[j]+1];
}
for(j=1;j<=m;j++)
{
int temp=num[p][k][j]*(r[j]-l[j]+1);
if(answer<temp)
answer=temp;
}
}
}
cout<<answer<<endl;
}
return 0;
}
hdu 2870 Largest Submatrix
最新推荐文章于 2019-03-09 00:32:43 发布