这道题跟1505 City Game 类似。不过,就是多了两个策略。。。。
#include<iostream>
using namespace std;
int main()
{
int left[1005][3];
int right[1005][3];
int a[1005][3];
int m,n,max;
char ch;
while(scanf("%d %d",&m,&n)==2)
{
max=0;
for(int i=0;i<m;i++)
{
getchar();
for(int j=0;j<n;j++)
left[j][0]=left[j][1]=left[j][2]=right[j][0]=right[j][1]=right[j][2]=j;
for(j=0;j<n;j++)
{
scanf("%c",&ch);
if(i)
{
if(ch=='a'||ch=='w'||ch=='y'||ch=='z') a[j][0]+=1; else a[j][0]=0;
if(ch=='b'||ch=='w'||ch=='x'||ch=='z') a[j][1]+=1; else a[j][1]=0;
if(ch=='c'||ch=='x'||ch=='y'||ch=='z') a[j][2]+=1; else a[j][2]=0;
}
else
{
if(ch=='a'||ch=='w'||ch=='y'||ch=='z') a[j][0]=1; else a[j][0]=0;
if(ch=='b'||ch=='w'||ch=='x'||ch=='z') a[j][1]=1; else a[j][1]=0;
if(ch=='c'||ch=='x'||ch=='y'||ch=='z') a[j][2]=1; else a[j][2]=0;
}
// printf("%d %d %d ",a[j][0],a[j][1],a[j][2]);
while(left[j][0]-1>=0&&a[j][0]&&a[j][0]<=a[left[j][0]-1][0])
left[j][0]=left[left[j][0]-1][0];
while(left[j][1]-1>=0&&a[j][1]&&a[j][1]<=a[left[j][1]-1][1])
left[j][1]=left[left[j][1]-1][1];
while(left[j][2]-1>=0&&a[j][2]&&a[j][2]<=a[left[j][2]-1][2])
left[j][2]=left[left[j][2]-1][2];
}
for(j=n-2;j>=0;j--)
{
while(right[j][0]+1<n && a[j][0] && a[j][0]<=a[right[j][0]+1][0])
right[j][0]=right[right[j][0]+1][0];
while(right[j][1]+1<n && a[j][1] && a[j][1]<=a[right[j][1]+1][1])
right[j][1]=right[right[j][1]+1][1];
while(right[j][2]+1<n && a[j][2] && a[j][2]<=a[right[j][2]+1][2])
right[j][2]=right[right[j][2]+1][2];
}
for(j=0;j<n;j++)
{
int ans=(right[j][0]-left[j][0]+1)*a[j][0];
if(ans>max)
max=ans;
ans=(right[j][1]-left[j][1]+1)*a[j][1];
if(ans>max)
max=ans;
ans=(right[j][2]-left[j][2]+1)*a[j][2];
if(ans>max)
max=ans;
}
}
printf("%d\n",max);
}
return 0;
}