洛谷U638374 最长回文子串 题解 字符串哈希+二分

题目链接:https://www.luogu.com.cn/problem/U638374

本题可以用 manacher 或者 字符串哈希+二分 求解。

这里用 字符串哈希 + 二分 解决。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
const unsigned long long B = 233;

unsigned long long fac[maxn] = {1}, h1[maxn], h2[maxn];
char s[maxn];
int n, ans;

bool check(int l, int r) {
    return (h1[r] - h1[l-1]) * fac[n-r] == (h2[l] - h2[r+1]) * fac[l-1];
}

void cal(int p, int q) {
    int l = 0, r = min(p-1, n-q);
    while (l <= r) {
        int mid = (l + r) / 2;
        if (check(p-mid, q+mid)) {
            ans = max(ans, (q+mid)-(p-mid)+1);
            l = mid + 1;
        }
        else
            r = mid - 1;
    }
}

int main() {
    cin >> s + 1;
    n = strlen(s + 1);
    for (int i = 1, j = n; i <= n; i++, j--) {
        fac[i] = fac[i-1] * B;
        h1[i] = h1[i-1] + (s[i] - 'a' + 1) * fac[i];
        h2[j] = h2[j+1] + (s[j] - 'a' + 1) * fac[i];
    }
    for (int i = 1; i <= n; i++) {
        cal(i, i);
        if (i < n) cal(i, i+1);
    }
    cout << ans << endl;
    return 0;
}
posted @ 2025-12-04 22:36  quanjun  阅读(18)  评论(0)    收藏  举报