//结合此文章的图片或者b站看ITI学院的讲解视频可以更快理解
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int p[N];
signed main(){
    string s,t;
    while(cin>>s){
        int n=s.size();
        int len=0;
        t="^#";//字符串前加^后加$可以避免判断越界(只要前后添加的两符号不同且字符串中不会出现即可) 
        for(int i=0;i<n;i++){
            t+=s[i];
            t+='#';
        }
        t+='$';
        memset(p,0,sizeof(p));
        int c=0,r=0;
        //c表示回文串的中心,r表示回文串的右边半径 
        //r=c+p[i]; 
        for(int i=1;i<t.size();i++){
            int i_mirror=2*c-i;//i_mirror表示当前需要求的第 i 个字符关于 C 对应的下标 
            if(i<r){
                p[i]=min(r-i,p[i_mirror]);//防止超出r 
            }        
            else{
                p[i]=0; //等于r 
            }
            //中心拓展法 
            while(t[i-1-p[i]]==t[i+1+p[i]]){
                p[i]++;
            }
            //判断是否需要更新r 
            if(i+p[i]>r){
                c=i;
                r=i+p[i];
            }
        }    
        int maxx=0;
        for(int i=1;i<t.size();i++){
            maxx=max(maxx,p[i]);//求最长回文串的长度
        }
        cout<<maxx<<endl;
    }
    return 0;