#include<stdio.h> #include<iostream> #include<string.h> #include<string> #define N 1020 using namespace std; int dp[N][N]; char str[N][N][N]; string st[N][N]; char a[N],b[N]; int maxn; string jieguo; int main() { int i,j,k,l; while(~scanf("%s",a+1)) { l=strlen(a+1); for(i=1;i<=l;i++) { b[i]=a[l-i+1]; } for(i=0;i<=l;i++) { dp[0][i]=0; dp[i][0]=0; //st[0][i]=""; //st[i][0]=""; st[i][0].clear(); st[0][i].clear(); } for(i=1;i<=l;i++) { for(j=1;j<=l;j++) { if(a[i]==b[j]) { dp[i][j]=dp[i-1][j-1]+1; st[i][j]=st[i-1][j-1]+a[i]; } else { if(dp[i][j-1]>dp[i-1][j]) { dp[i][j]=dp[i][j-1]; st[i][j]=st[i][j-1]; } else if(dp[i][j-1]==dp[i-1][j]) { dp[i][j]=dp[i][j-1]; if(st[i][j-1]>st[i-1][j]) { st[i][j]=st[i-1][j]; } else st[i][j]=st[i][j-1]; } else { dp[i][j]=dp[i-1][j]; st[i][j]=st[i-1][j]; } } } } maxn=-1; int flag=0; //jieguo=""; jieguo.clear(); //jieguo存对称的部分 for(i=1;i<l;i++)//偶数情况 { if(flag==0) { maxn=dp[i][l-i]; jieguo=st[i][l-i]; flag=1; continue; } if(maxn<dp[i][l-i]) { maxn=dp[i][l-i]; jieguo=st[i][l-i]; } else if(maxn==dp[i][l-i]) { if(jieguo>st[i][j-1]) jieguo=st[i][j-1]; } } maxn=maxn*2; int tmp=0; for(i=1;i<=l;i++)//把第i个字符当做奇数回文中心 { if(maxn<dp[i-1][l-i]*2+1) { maxn=dp[i-1][l-i]*2+1; jieguo=st[i-1][l-i]+a[i]; } //if(maxn==dp[i-1][l-i-1])//不可能出现 else if(maxn==dp[i-1][l-i]*2+1) { if(jieguo>(st[i-1][l-i]+a[i])) jieguo=st[i-1][l-i]+a[i]; } } if(maxn%2==0) { //printf("%s",jieguo); cout<<jieguo; for(i=jieguo.length()-1;i>=0;i--) { //printf("%c",jieguo[i]); cout<<jieguo[i]; } } else { //printf("%s",jieguo); cout<<jieguo; for(i=jieguo.length()-2;i>=0;i--) { //printf("%c",jieguo[i]); cout<<jieguo[i]; } } printf("\n"); } return 0; }