题意略。
是hdu 1505 的变形,先将所有能变的都变,得到一个没有w、x、y、z的矩阵。
然后就是重复1505的做法了,求三次,取最大值。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char mp[1005][1005];
char w[1005][1005];
int t[1005][1005];
int le[1005],ri[1005];
int m,n,ans,tmp;
void solve(char key,char a,char b,char c)
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(mp[i][j]==a || mp[i][j]==b || mp[i][j]==c)
w[i][j]=key;
else w[i][j]=mp[i][j];
}
}
memset(t,0,sizeof(t));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(w[i][j]==key)
t[i][j]=t[i-1][j]+1;
else t[i][j]=0;
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
le[j]=ri[j]=j;
for(int j=2;j<=n;j++)
{
while(le[j]>1 && t[i][j]<=t[i][le[j]-1])
le[j]=le[le[j]-1];
}
for(int j=n-1;j>=1;j--)
{
while(ri[j]<n && t[i][j]<=t[i][ri[j]+1])
ri[j]=ri[ri[j]+1];
}
for(int j=1;j<=n;j++)
{
tmp=t[i][j]*(ri[j]-le[j]+1);
if(tmp>ans)
ans=tmp;
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(mp,0,sizeof(mp));
ans=-1;
for(int i=1;i<=m;i++)
scanf("%s",mp[i]+1);
solve('a','w','y','z');
solve('b','w','x','z');
solve('c','x','y','z');
printf("%d\n",ans);
}
return 0;
}