manacher
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; const int N = 101000100; char str[N]; int pos, ans, rl[N], len, maxRight; int main() { scanf("%s", str); len = strlen(str); for(int i = len - 1 ; i >= 0 ; -- i) str[2 * i + 1] = str[i]; len = len * 2 + 1; for(int i = 0 ; i < len ; ++ i) if(!(i & 1)) str[i] = '#'; for(int i = 0 ; i < len ; ++ i) { if(i < maxRight) rl[i] = min(rl[2 * pos - i], maxRight - i); else rl[i] = 1; while(i - rl[i] >= 0 && i + rl[i] < len && str[i - rl[i]] == str[i + rl[i]]) ++ rl[i]; if(i + rl[i] - 1 > maxRight) { maxRight = i + rl[i] - 1; pos = i; } ans = max(ans, rl[i]); } printf("%d\n", ans - 1); }