2 4 abcw wxyz
3
又是一个悲伤的故事,做了一上午,其实就是和1505和1506一样,这题枚举一下a,b,c,就行了,不知为什么酒一直wa,看别人的题解,没有用我这种方法的,都是记一下最左边大于等于它的位置,和右边大于等于它的位置,和我的方法在原理上是一样的,我是记左边大于等于它的位置,右边大于等于它的位置,debug了半天才发现把m打成了n。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn=1000+100; char s[maxn][maxn]; int a[maxn][maxn]; int dpl[maxn],dpr[maxn]; int n,m; int ans; void solve(char c,char w,char x,char y) { for(int i=1;i<=n;i++) { a[i][0]=a[i][m+1]=-1; for(int j=1;j<=m;j++) { if(s[i][j]==c||s[i][j]==w||s[i][j]==x||s[i][j]==y) { if(i>1) a[i][j]=a[i-1][j]+1; else { a[i][j]=1; } } else { a[i][j]=0; } } int temp; memset(dpl,0,sizeof(dpl)); memset(dpr,0,sizeof(dpr)); dpl[1]=1; dpr[m]=1; for(int j=2;j<=m;j++) { int k; dpl[j]=1; if(a[i][j]) { k=j; while(a[i][j]<=a[i][k-1]) { dpl[j]+=dpl[k-1]; k-=dpl[k-1]; } // while(a[i][dpl[j]-1]>=a[i][j]) // dpl[j]=dpl[dpl[j]-1]; } } for(int j=m-1;j>=1;j--) { int k; dpr[j]=1; if(a[i][j]) { k=j; while(a[i][j]<=a[i][k+1]) { dpr[j]+=dpr[k+1]; k=k+dpr[k+1]; } // while(a[i][dpr[j]+1]>=a[i][j]) // dpr[j]=dpr[dpr[j]+1]; } } for(int j=1;j<=m;j++) { if(a[i][j]) { temp=a[i][j]*(dpr[j]+dpl[j]-1); // temp=a[i][j]*(dpr[j]-dpl[j]+1); if(ans<temp) ans=temp; } } } } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) { scanf("%s",s[i]+1); } ans=0; solve('a','w','y','z'); solve('b','w','x','z'); solve('c','x','y','z'); printf("%d\n",ans); } return 0; }