#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*
解题思路:
相当于找最长回文字串,中心扩展法重复次数太多了,还是用动态规划
因为可以利用之前检验串是否是回文,dp[i][j]表示s[i]到s[j]是否是回文串
是则为1,否则为0
若s[i] == s[j] 那么只要s[i+1]到s[j-1]是回文串就行
若s[i] != s[j] 那么s[i]到s[j]一定不是回文串
综上 状态转移方程为 dp[i][j] = ①dp[i+1][j-1],s[i] == s[j] ②0,s[i] != s[j]
再考虑边界:dp[i][i] = 1(自己对自己)
dp[i][i+1] = (s[i] == s[i+1]) ? 1:0 (相邻两个)
用长度锚定字符可以避免状态无法转移,具体看代码
*/
int main() {
string s;
cin >> s;
int len = s.length();
int maxLen = 0;
vector<vector<int> > dp(len,vector<int>(len,0));
//边界
for(int i = 0 ; i < len ; ++i){
dp[i][i] = 1;//单个字符
if(i < len - 1){//避免i+1越界
if(s[i] == s[i+1]){//相邻两个字符
dp[i][i+1] = 1;//是回文
maxLen = 2;//长度为2
}
}
}
for(int L = 3; L <= len ; L++){
for(int i = 0; i+L-1 < len ; i++){//i为右端点
int j = i+L-1;//j为左端点
if(s[i] == s[j] && dp[i+1][j-1] == 1){
dp[i][j] = 1;
maxLen = L;
}
}
}
cout << maxLen << endl;
}
// 64 位输出请用 printf("%lld")