#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespace std;constint MAXN =100000+10;char Ma[MAXN <<1];int Mp[MAXN <<1];voidManacher(char s[],int len){int l =0;
Ma[l ++]='$';
Ma[l ++]='#';for(int i =0; i < len; i ++){
Ma[l ++]= s[i];
Ma[l ++]='#';}
Ma[l]=0;int mx =0, id =0;for(int i =1; i < l; i ++){
Mp[i]= mx > i ?min(Mp[2* id - i], mx - i):1;while(Ma[i + Mp[i]]== Ma[i - Mp[i]]) Mp[i]++;if(i + Mp[i]> mx){
mx = i + Mp[i];
id = i;}}}char s[MAXN];intmain(){while(scanf("%s", s)!=EOF){int len =strlen(s);Manacher(s, len);int ans =0;for(int i =0; i <2* len +2; i ++)
ans =max(ans, Mp[i]-1);printf("%d\n", ans);}return0;}
Java
staticint MAXN =100000+10;publicstaticvoidmain(String args[])throws IOException
{
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
InputReader in =newInputReader(inputStream);
PrintWriter out =newPrintWriter(outputStream);
Task solver =newTask();
solver.solve(in, out);
out.close();}staticclassTask{publicvoidsolve(InputReader in, PrintWriter out)throws IOException{while(in.hasNext()){
String s = in.next();Manacher(s);int ans =0;for(int i =0; i <2* s.length()+2; i ++)
ans = Math.max(ans, Mp[i]-1);
out.println(ans);}}}staticint Mp[]=newint[MAXN <<1];staticchar Ma[];publicstaticvoidManacher(String s){char a[]= s.toCharArray();
StringBuilder tmp =newStringBuilder();
tmp.append("@");
tmp.append("$");for(int i =0; i < a.length; i ++){
tmp.append(a[i]);
tmp.append("$");}
Ma = tmp.toString().toCharArray();int mx =0, id =0;for(int i =0; i < Ma.length; i ++){
Mp[i]= mx > i ? Math.min(Mp[2* id - i], mx - i):1;while((i - Mp[i]>=0)&&(i + Mp[i]< Ma.length)&&(Ma[i + Mp[i]]== Ma[i - Mp[i]])){
Mp[i]++;}if(i + Mp[i]> mx){
mx = i + Mp[i];
id = i;}}}