#include
#include<string>
using namespace std;
int main(){
string str;
while(cin>>str){
if(str.size()!=0){
int i=0,j=0;
char *ch=new char[2*str.size()];
int *p=new int[2*str.size()];
int maxi,max;
ch[j++]=str[i++];
while(i<str.size()){
ch[j++]=’#’;
ch[j++]=str[i++];
}
ch[j]=’\0′;
//cout<<ch<<endl;
i=0;
maxi=i;
max=i;
p[i++]=0;
//cout<<” “;
while(i<j){
if(maxi+p[maxi]<=i){ //当i在最大半径之外(上),从0开始扩
int k=1;
p[i]=0;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
else{
if(maxi+p[maxi]-i==p[2*maxi-i]){ //当i在最大半径之内,且到最大半径边界的距离等于对称点的扩展半径
p[i]=p[2*maxi-i];
int k=p[i]+1;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}//cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
else if(maxi+p[maxi]-i>p[2*maxi-i]){ //当i在最大半径之内,且到最大半径边界的距离大于对称点的扩展半径
p[i]=p[2*maxi-i];//cout<<p[i];
}
else{
//当i在最大半径之内,且到最大半径边界的距离小于对称点的扩展半径
p[i]=maxi+p[maxi]-i;
int k=p[i]+1;
while((i-k>=0&&i+k<j)&&(ch[i-k]==ch[i+k])){
k++;
p[i]++;
}//cout<<p[i];
if(p[max]<p[i]){
max=i;
}
if(p[maxi]+maxi<=p[i]+i){
maxi=i;
}
}
}
++i;
}
if(ch[max-p[max]]!=’#’)
cout<<p[max]+1<<endl;
else
cout<<p[max]<<endl;
delete[] ch;
delete[] p;
}
else{
cout<<0<<endl;
}
}
return 0;
}