/*
详细资料 http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html
最长回文串
*/
#include<stdio.h>
#include<string.h>
const int maxn=110000+100;
char str[maxn<<1],b[maxn];
int p[maxn<<1];
int min(int x,int y)
{
if(x<y) return x;
return y;
}
int main()
{
int i,n,id;
while(scanf("%s",&b[1])!=EOF)
{
//printf("%d****\n" ,strlen(b+1));
for( i=1;b[i]!='\0';i++)
{
str[(i<<1)]=b[i];
str[(i<<1)+1]='#';
}
str[0]='?';
str[1]='#';
n=((i-1)<<1)+2;
// printf("(n)%d***\n",n);
str[n]='\0';
// printf("%s",str);
memset(p,0,sizeof(p));
int MaxId=0;
int MaxLen=0;
id=0;
for(i=1;i<n;i++)
{
if(MaxId>i)
p[i]=min(p[2*id-i],MaxId-i);
else
p[i]=1;
while(str[i+p[i]] == str[i-p[i]])
p[i]++;
if(p[i]+i>MaxId)
{
MaxId= p[i]+i;
//MaxId=i;
id=i;
}
if(p[i]>MaxLen)
{
MaxLen = p[i];
}
}
printf("%d\n",MaxLen-1);
}
return 0;
}