动态规划
#include<bits/stdc++.h>
using namespace std;
const int N = 2e4 + 10;
string s;
int dp[N][N];
int main()
{
cin >> s;
int n = s.size();
for(int i = 0; i < n; i ++)
{
dp[i][i] = 1;//长度为1的字符串都是回文串
}
int maxlen = 1;//记录最长回文串
int start;
for(int len = 2; len <= n; len ++)//枚举回文串长度
{
for(int left = 0; left + len - 1 < n; left ++)//枚举左端点
{
int right = left + len - 1;//枚举右端点
if(s[left] != s[right])//左右两边不一样一定不是回文串
{
dp[left][right] = 0;
}
else//左右两边一样,说明当前字符串是否是回文串取决于[left + 1...right - 1]区间的字符串是否是回文串
{
if(len == 2)dp[left][right] = 1;
else
{
dp[left][right] = dp[left + 1][right - 1];
}
}
if(len > maxlen)
{
if(dp[left][right] == 1)
{
maxlen = len;
start = left;
}
}
}
}
cout << maxlen;
string t = "";
for(int i = start; i < start + maxlen; i ++)t += s[i];
cout << t;
return 0;
}