#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector VI; typedef pair PII; #define REP(i,s,t) for(int i=(s);i<(t);i++) #define FILL(x,v) memset(x,v,sizeof(x)) #define MAXN 5005 int n, ans; string s; void solve(int l, int r, int ml) { bool haslr = l >= 0 && r < n; bool mismatch = !haslr || s[l] != s[r]; if (!mismatch) { solve(l - 1, r + 1, ml); return; } if (ml == -1) { ans = max(ans, r - l - 1); if (haslr) solve(l - 1, r + 1, l); return; } else if (ml == -2) { ans = max(ans, r - l - 1); return; } else { int mr = r - (ml - l); if (haslr && ((s[ml] == s[r] && s[mr] == s[l]) || (s[ml] == s[l] && s[mr] == s[r]))) { solve(l - 1, r + 1, -2); } else { ans = max(ans, mr - ml - 1); REP(i,1,n+1) { int cl = ml - i, cr = mr + i; if (cl <= l || cr >= r) break; if (s[cl] == s[ml] || s[cr] == s[ml] || s[cl] == s[mr] || s[cr] == s[mr]) { ans = max(ans, cr - cl - 1); } } VI cands; REP(i,0,n) if (i <= l || i >= r) cands.push_back(i); if ((mr - ml) % 2 == 0) cands.push_back((ml + mr) / 2); // don't forget center! for (auto i: cands) { if (s[i] == s[ml] || s[i] == s[mr]) { ans = max(ans, r - l - 1); } } } } } int main() { cin >> s; n = s.size(); ans = 1; REP(i,0,n) { solve(i - 1, i + 1, -1); solve(i, i + 1, -1); } cout << ans << endl; return 0; }