题目大意:给你一个字符串,求出它的最长回文字段
题解:$manacher$算法
卡点:$p$数组未开两倍空间
C++ Code:
#include <cstdio> #include <cstring> #define maxn 11000010 char o[maxn], s[maxn << 1]; int p[maxn << 1]; int n; inline int min(int a, int b) {return a < b ? a : b;} inline int max(int a, int b) {return a > b ? a : b;} int manacher(char *s) { int mx = 0, mid = 0, n = strlen(s), ans = 1; for (int i = 1; i < n; i++) { p[i] = mx > i ? min(p[(mid << 1) - i], mx - i) : 1; while (s[i - p[i]] == s[i + p[i]]) p[i]++; if (p[i] + i > mx) mx = p[i] + i, mid = i; ans = max(ans, p[i] - 1); } return ans; } int main() { scanf("%s", o); n = strlen(o); s[0] = '$'; for (int i = 0; i < n; i++) { s[i << 1 | 1] = '$'; s[i + 1 << 1] = o[i]; } s[(n = n << 1 | 1)++] = '$'; printf("%d ", manacher(s)); return 0; }