求调 代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+5;
char a[N][N];
int q[N];
int f[N][N];
int l[N];
int r[N];
int dep[N];
int num[N];
void dfs(int x)
{
dep[x] = 1;
if(l[x])
{
dfs(l[x]);
dep[x] = max(dep[x],dep[l[x]]+1);
}
if(r[x])
{
dfs(r[x]);
dep[x] = max(dep[x],dep[r[x]]+1);
}
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
cin >> a[i][j];
}
}
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
if(a[i-1][j] == 'F'&&a[i][j] == 'F')
{
f[i][j] = f[i-1][j]+(a[i][j] == 'F');
}
else if(a[i][j] == 'F')
{
f[i][j] = 1;
}
}
}
int maxx = 0;
for(int i = 1;i<=n;i++)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
int t = 0;
for(int j = 1;j<=m;j++)
{
while(t&&f[i][q[t]]>f[i][j])
{
l[j] = q[t];
t--;
}
if(t)
{
r[q[t]] = j;
}
q[++t] = j;
}
for(int j = 1;j<=m;j++)
{
num[l[j]] = i;
num[r[j]] = i;
}
for(int j = 1;j<=m;j++)
{
if(num[j]!=i)
{
dfs(j);
break;
}
}
for(int j = 1;j<=m;j++)
{
maxx = max(maxx,(dep[l[j]]+dep[r[j]]+1)*f[i][j]);
}
}
printf("%d",maxx*3);
return 0;
}