思路:对每一列中连续的F进行统计,模拟出一个统计表,用x轴做底,单位长度为1,高度记录的是连续F的个数,然后利用并查集的性质,在正常的高度范围内,找出最大的长度。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<string.h>
using namespace std;
const int maxn=1010;
int dis[maxn];
int height[maxn];
int n,m,ans;
int max(int a,int b)
{
return a>b?a:b;
}
void get_sum(int n)
{
vector<int>L(n+2,0);
vector<int>R(n+2,0);
height[0]=height[n+1]=-1;
for(int i=0; i<=n; i++)
{
L[i]=i;
R[i]=i;
}
for(int i=1; i<=n; i++)
if(height[L[i]-1]>=height[i])
L[i]=L[L[i]-1];
for(int i=n; i>=1; i--)
if(height[R[i]+1]>=height[i])
R[i]=R[R[i]+1];
for(int i=1; i<=n; i++)
ans=max(ans,(dis[R[i]]-dis[L[i]]+1)*height[i]);
}
int main()
{
int p;
while(scanf("%d",&p)!=EOF)
{
while(p--)
{
scanf("%d%d",&m,&n);
ans=0;
memset(dis,0,sizeof(dis));
memset(height,0,sizeof(height));
for(int i=1; i<=n; i++)
dis[i]=1+dis[i-1];
for(int i=0; i<m; i++)
{
char tem;
for(int i=1; i<=n; i++)
{
cin>>tem;
if(tem=='F')
height[i]+=1;
else
height[i]=0;
}
get_sum(n);
}
printf("%d\n",3*ans);
}
}
return 0;
}