/*
题目连接:http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1002
类型:回文串
方法,资料链接 http://www.cnblogs.com/wuyiqi/archive/2012/06/25/2561063.html
不明白为什么解释的那么麻烦,绕了一大圈 ,其实还可以用dp解答的,下附解。。。
*/
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
#define manx 10009
int p[manx],len;
char ch[manx*2];
int main(){
string str;
while(cin>>str){
len=1;
p[len]=0,ch[len++]='#';
for(int i=0;i<str.size();i++){
p[len]=0;
ch[len++]=str[i];
p[len]=0;
ch[len++]='#';
}
int mx=0;
for(int i=1;i<len;i++){/重点
for(int j=1;i-j>=1 && i+j<len && ch[i-j]==ch[i+j]; p[i]++,j++ ) ;
if(mx<p[i]) mx=p[i];
}
cout<<mx<<endl;
}
}
/*
关键是建立模型,但是我不明白为什么超时了,时间复杂度为 N^2
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
#define manx 1009
int dp[manx][manx];
int main(){
string str;
while(cin>>str){
int maxx=1;
for(int i=0;i<str.size();i++)
for(int j=0;j<=i;j++)
dp[j][i]=1;
for(int i=1;i<str.size();i++){///主串
for(int j=i-1;j>=0;j--){
if(j==i-1 && str[j]==str[i]){
dp[j][i]=2;
if(maxx<dp[j][i]) maxx=dp[j][i];
continue;
}
if(str[j]==str[i])/// 状态转移方程
dp[j][i]=max(dp[j+1][i-1]+2,dp[j][i]);
if(maxx<dp[j][i]) maxx=dp[j][i];
}
}
cout<<maxx<<endl;
}
}