题目:https://ac.nowcoder.com/acm/problem/14294
根据题意我们能知道:这道题直接做是不太好做的
我们可以预处理出来左下,右下,向下的子符串最大延伸长度
a[i][j]为(i,j)向右下延伸的最长距离
b[i][j]为(i,j)向下延伸的最长距离
c[i][j]为(i,j)向左下延伸的最长距离
然后枚举就行
#include<iostream>
#include<algorithm>
using namespace std;
const int max_n = 2000 + 100;
char chs[max_n][max_n];
int a[max_n][max_n], b[max_n][max_n], c[max_n][max_n];
int ans = 0;
int main() {
ios::sync_with_stdio(0);
int n, m;cin >> n >> m;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
cin >> chs[i][j];
for (int i = n;i > 0;i--)
for (int j = m;j > 0;j--)
if (chs[i][j] == 'X') {
a[i][j] = a[i + 1][j + 1] + 1;
b[i][j] = b[i + 1][j] + 1;
c[i][j] = c[i + 1][j - 1] + 1;
}
for (int i = 1;i <= n;i++) {
if (n - i + 1 <= ans)break;
for (int j = 1;j <= m;j++) {
if (m - j + 1 <= ans)break;
int k = min(a[i][j], b[i][j]);k--;
if (k & 1)k--;
while (k + 1) {
if (k + 1 <= ans)break;
int cmp = min(b[i][j + k], c[i][j + k]);
if (cmp >= k) { ans = k + 1;break; }
k -= 2;
}
}
}cout << ans << endl;
}