#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#define _min(_a_,_b_) ((_a_)<(_b_)?(_a_):(_b_))
#define _max(_a_,_b_) ((_a_)>(_b_)?(_a_):(_b_))
char os[105050],s[205050];
int rad[205050],lbeg[205050],rend[205050];
inline void ManacherR(char s[],register int ls)
{
register int pos=0,mxr=0;
for(register int i=1;i<=ls;i++)
{
if(i < mxr)
rad[i]=_min(rad[(pos<<1)-i],mxr-i);
else
rad[i]=1;
while(s[i-rad[i]] == s[i+rad[i]])
rad[i]++;
if(mxr < i+rad[i])
{
for(register int j=mxr+1;j<=i+rad[i];j++)
rend[j]=i;
mxr=i+rad[i],pos=i;
}
}
pos=ls+1,mxr=ls+1; // mxr <-> mnl
for(register int i=ls;i>=1;i--)
{
if(i > mxr)
rad[i]=_min(rad[(pos<<1)-i],i-mxr);
else
rad[i]=1;
while(s[i-rad[i]] == s[i+rad[i]])
rad[i]++;
if(mxr > i-rad[i])
{
for(register int j=i-rad[i];j<mxr;j++)
lbeg[j]=i;
mxr=i-rad[i],pos=i;
}
}
}
int main()
{
scanf("%s",&os[1]);
register int ols=strlen(&os[1]),ls=0;
s[0]=1,s[++ls]='#';
for(register int i=1;i<=ols;i++)
s[++ls]=os[i],s[++ls]='#';
ManacherR(s,ls);
register int ans=0;
for(register int i=1;i<=ls;i+=2)
if(lbeg[i] && rend[i])
ans=_max(ans,lbeg[i]-rend[i]);
printf("%d\n",ans);
return 0;
}