难度:5
训练指南上面好像不是用单调栈写的,还是需要学习一下它的写法
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int maxn = 1005;
int mat[maxn][maxn];
int main() {
int t;
cin >> t;
while (t--) {
memset(mat, 0, sizeof(mat));
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
getchar();
char c;
cin >> c;
if (c == 'F') mat[i][j] = 1;
else mat[i][j] = 0;
if (i && mat[i][j]) mat[i][j] += mat[i - 1][j];
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
stack<pa> st;
for (int j = 0; j <= m; j++) {
int tmp = 0;
while (!st.empty() && mat[i][j] < st.top().fi) {
pa p = st.top(); st.pop();
tmp += p.se;
ans = max(ans, tmp * p.fi);
}
st.push(make_pair(mat[i][j], tmp + 1));
}
}
cout << ans * 3 << endl;
}
return 0;
}