比赛 NOIP2025模拟赛2 评测结果 AAAAAAAAAAAAAAAA
题目名称 回文块 最终得分 100
用户昵称 wdsjl 运行时间 0.647 s
代码语言 C++ 内存使用 43.74 MiB
提交时间 2025-11-25 10:35:38
显示代码纯文本
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;

const int M = 13331;
const int N = 5e6 + 10;

ull has[N];
ull pw[N]; 
int T, len;
char s[N];

void pre() {
    pw[0] = 1;
    for (int i = 1; i < N; i++) {
        pw[i] = pw[i - 1] * M;
    }
}

ull calc(int l, int r) {
    return has[r] - has[l - 1] * pw[r - l + 1];
}

int main() {
    freopen("palin.in","r",stdin);
    freopen("palin.out","w",stdout);	
    pre(); 
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> T;
    while (T--) {
        cin >> (s + 1);
        len = strlen(s + 1);
        has[0] = 0;
        for (int i = 1; i <= len; i++) {
            has[i] = has[i - 1] * M + s[i];
        }
        int l = 1;
        int r = len;
        int cnt = 0;
        while (l <= r) {
            bool iok = false;
            int mps = (r - l + 1) / 2;
            for (int k = 1; k <= mps; k++) {
                ull hash_left = calc(l, l + k - 1);
                ull hash_right = calc(r - k + 1, r);
                if (hash_left == hash_right) {
                    cnt += 2;
                    l += k;
                    r -= k;
                    iok = true;
                    break; 
                }
            }
            if (!iok) {
                cnt += 1;
                break;
            }
        }

        cout << cnt << '\n';
    }
    return 0;
}