洛谷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;
}
浙公网安备 33010602011771号