#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
char a[N][N];
int q[N]; //单调栈
int s[N][N]; //标志每一行的最大连续F
int M[N];
int n, m;
int res = 0;
int calc(int h[], int n)
{
h[0] = h[n+1] = -1;
int tt = 0;
q[tt] = 0;
int max_area = 0;
for (int i = 1; i <=n+1; i ++ )
{
while (tt > 0 && h[i] < h[q[tt]])
{
int top_value = h[q[tt]];
tt--;
int l = q[tt];
int r = i;
max_area = max(max_area, top_value*(r-l-1) );
}
q[++tt] = i;
}
return max_area;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i<= n; i++)
{
for (int j = 1; j<=m ; j++)
{
char c;
//cin>>c;
scanf("%s", &c);
if (c == 'F') s[i][j] = s[i-1][j] + 1;
else s[i][j] = 0;
}
res = max(res, calc(s[i], m));
}
cout<<res*3<<endl;
}
在读入数据的时候,其实矩阵都没必要读入,就是读每一行,有F的时候 就在这一列的上一行有几个F的基础上加一即可。注意i和j都要从1开始。