manacher
先用manacher求出p数组,f[i]表示以i结尾最靠左的回文中心,那么每次用i-f[i-p[i]]更新答案就可以了,感觉十分巧妙......
#include<bits/stdc++.h> using namespace std; const int N = 200010; int n, len, ans, mx, pos; int p[N], f[N]; char s[N], t[N]; int main() { scanf("%s", t + 1); n = strlen(t + 1); s[0] = '!'; s[len = 1] = '#'; for(int i = 1; i <= n; ++i) s[++len] = t[i], s[++len] = '#'; for(int i = 1; i <= len; ++i) { if(i < mx) p[i] = min(p[2 * pos - i], mx - i); while(s[i - p[i]] == s[i + p[i]]) { if(!f[i + p[i]]) f[i + p[i]] = i; ++p[i]; } if(i + p[i] > mx) { pos = i; mx = i + p[i]; } } for(int i = 1; i <= len; ++i) ans = max(ans, i - f[i - p[i]]); printf("%d ", ans); return 0; }