题意略。
是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; }