#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; typedef pair P; string s; int sa[400002], lcp[400002], rk[400002]; int tmp[400002]; int n, k; bool compare_sa(int i, int j){ if(rk[i]!=rk[j]) return rk[i]0) h--; for(; j+h=1; i--){ mn[i]=min(mn[2*i], mn[2*i+1]); } } int query(int a, int b){ a+=m0, b+=m0; int ans=INF; for(;a>=1, b>>=1){ if(b&1) ans=min(ans, mn[--b]); if(a&1) ans=min(ans, mn[a++]); } return ans; } int main() { cin>>s; int m=s.size(); string t=s; reverse(t.begin(), t.end()); s+='$'+t; construct_sa(s, sa); construct_lcp(s, sa, lcp); for(int i=0; i<=s.size(); i++) rk[sa[i]]=i; init(s.size()+1); int ans=0; for(int i=0; i=0 || i+l<=m-1) ans=max(ans, 2*l-1); else ans=max(ans, m-2); if(i-l>0 && s[i-l-1]==s[i+l]){ int j1=2*m-(i-l-1); int l1=query(min(rk[j1], rk[i+l]), max(rk[i+l], rk[j1])); ans=max(ans, 2*l-1+2*l1); } if(i+l=0 && i+l-1<=m-1 && s[i-l]==s[i+l-1]){ int j1=2*m-(i-l); int l1=query(min(rk[i+l-1], rk[j1]), max(rk[i+l-1], rk[j1])); ans=max(ans, 2*l-3+2*l1); } if(i-l+1>=0 && i+l<=m-1 && s[i-l+1]==s[i+l]){ int j1=2*m-(i-l+1); int l1=query(min(rk[i+l], rk[j1]), max(rk[i+l], rk[j1])); ans=max(ans, 2*l-3+2*l1); } } for(int i=1; i=0 || i+l<=m-1) ans=max(ans, 2*l); else ans=max(ans, m-2); if(i-l-1>0 && s[i-l-2]==s[i+l]){ int j1=2*m-(i-l-2); int l1=query(min(rk[j1], rk[i+l]), max(rk[i+l], rk[j1])); ans=max(ans, 2*l+2*l1); } if(i+l=0 && i+l-1<=m-1 && s[i-l-1]==s[i+l-1]){ int j1=2*m-(i-l-1); int l1=query(min(rk[i+l-1], rk[j1]), max(rk[i+l-1], rk[j1])); ans=max(ans, 2*l-2+2*l1); } if(i-l>=0 && i+l<=m-1 && s[i-l]==s[i+l]){ int j1=2*m-(i-l-1); int l1=query(min(rk[i+l], rk[j1]), max(rk[i+l], rk[j1])); ans=max(ans, 2*l-2+2*l1); } } cout<