// BOJ 13275 // Manacher Algorithm #include <bits/stdc++.h> using namespace std; struct node { int r; // radius int p; // preserve int c; // center }; vector<node> manacher(string s) { int n = size(s); s.resize(2*n+1); s[2*n] = '#'; for (int i=n-1; i>=0; i--) { s[2*i+1] = s[i]; s[2*i] = '#'; } vector<node> ret(2*n+1, {0, 0, 0}); for (int i=0; i<=2*n; i++) ret[i].c = i; int dp_p = -1; int dp_c = 0; for (auto &[r, p, c] : ret) { if (c <= dp_p) { int cor_r = ret[2*dp_c-c].r; r = min(dp_p-c, cor_r); } else r = 0; while ( (c-r >= 0 && c+r <= 2*n) && (s[c-r] == s[c+r]) ) r++; r--; if (c+r > dp_p) tie(dp_p, dp_c) = make_pair(c+r, c); tie(p, c) = make_pair(dp_p, dp_c); } return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); string s; cin >> s; auto arr = manacher(s); int ans = 0; for (auto &[r, p, c] : arr) { if (c%2 == 0) ans = max(ans, r); if (c%2 == 1) ans = max(ans, r); } cout << ans << '\n'; return 0; }