Manacher
#include<bits/stdc++.h> #define ri register int #define ll long long #define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0) using namespace std; const inline int read(){ int k = 0, f = 1; char c = getchar(); for(;!isdigit(c); c = getchar()) if(c == '-') f = -1; for(;isdigit(c); c = getchar()) k = k * 10 + c - '0'; return k * f; } #define maxn 11000005 int len, p[maxn * 2], ans = 0; char s[maxn], ss[maxn * 2]; void manacher(char *s, int len){ int l = 0; ss[l++] = '$'; ss[l++] = '#'; for(ri i = 0; i < len; ++i){ ss[l++] = s[i]; ss[l++] = '#'; } ss[l] = 0; int mx = 0, po = 0; for(ri i = 1; i < l; ++i){ if(mx > i) p[i] = min(mx - i, p[2 * po - i]);//继承对称点的值||继承到边界继续搜 else p[i] = 1; while(ss[i - p[i]] == ss[i + p[i]])//以i为中心搜索 p[i]++; if(p[i] + i > mx){//最右点mx更新 mx = p[i] + i; po = i; } ans = max(ans, p[i]); } } int main(){ fast; cin >> s; len = strlen(s); manacher(s, len); ans--;//p[i] - 1 == 以该点为中心回文串的长度 cout << ans; }
Never say never.


浙公网安备 33010602011771号