题解 P2427 【Wave】

· · 题解

传送门

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 1010;
char g[N][N];
int s[N][N][26];
int n, m, T;

void init()
{
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            for (int k = 0; k < 26; k ++ )
                s[i][j][k] = s[i - 1][j][k] + s[i][j - 1][k] - s[i - 1][j - 1][k] + (g[i][j] - 'a' == k ? 1 : 0);
}

int Biggest_square(int x, int y)
{
    int type = g[x][y] - 'a', res = 1;
    int l = min(min(n - x, x - 1), min(m - y, y - 1));
    if (l == 0) return 1;

    for (int i = 1; i <= l; i ++ )
    {
        int cnt = s[x + i][y + i][type] - s[x - i - 1][y + i][type] - s[x + i][y - i - 1][type] + s[x - i - 1][y - i - 1][type];
        if (cnt == (2 * i + 1) * (2 * i + 1)) res = max(res, 2 * i + 1);
        else break;
    }
    return res;
}

int main()
{
    scanf("%d%d%d", &n, &m, &T);

    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            cin >> g[i][j];

    init();
    while (T -- )
    {
        int x, y;
        scanf("%d%d", &x, &y);
        x += 1, y += 1;
        printf("%d\n", Biggest_square(x, y));
    }

    return 0;
}