Pagini recente » Cod sursa (job #769021) | Cod sursa (job #2873852) | Cod sursa (job #1460778) | Cod sursa (job #934833) | Cod sursa (job #1319566)
#include <fstream>
#include <iostream>
using namespace std;
#include <string>
#include <vector>
ifstream f("elimin2.in");
ofstream g("elimin2.out");
#define LE 2066
#define sh short int
string s;
int i,j;
sh dp[LE][LE];
sh lcif[LE][LE];
int result,res[LE],Right[LE][66],Left[LE][66];
int indi,indj,lres,k,st;
string s2;
int main(){
f>>s2;
int n=s2.length();
for(i=0;i<n;++i) s+=(s2[i]-'0');
for(i=n-1;i>=0;--i)
for(j=i;j<n;++j){
dp[i][j]=dp[i+1][j-1],lcif[i][j]=lcif[i-1][j-1];
if (s[i]==s[j]&&i!=j) dp[i][j]=dp[i+1][j-1]+2,lcif[i][j]=s[i];
if (i==j) dp[i][j]=1,lcif[i][j]=s[i];
if (dp[i+1][j]>dp[i][j]||(dp[i+1][j]==dp[i][j]&&lcif[i+1][j]>lcif[i][j])){
dp[i][j]=dp[i+1][j];
lcif[i][j]=lcif[i+1][j];
}
if (dp[i][j-1]>dp[i][j]||(dp[i][j-1]==dp[i][j]&&lcif[i][j-1]>lcif[i][j])){
dp[i][j]=dp[i][j-1];
lcif[i][j]=lcif[i][j-1];
}
if (dp[i][j]>result||(result==dp[i][j]&&lcif[i][j]>lres)){
result=dp[i][j];
lres=lcif[i][j];
indi=i,indj=j;
}
}
for(i=n-1;i>=0;--i){
for(j=0;j<=9;++j) Right[i][j]=(i==n-1?n:Right[i+1][j]);
if (i!=n-1) Right[i][s[i+1]]=i+1;
}
for(i=0;i<n;++i){
for(j=0;j<=9;++j) Left[i][j]=(i>0?Left[i-1][j]:-1);
if (i>0) Left[i][s[i-1]]=i-1;
}
//cout<<n<<'\n';
// for(i=0;i<n;++i,cout<<'\n')
//for(j=0;j<=9;++j) cout<<Left[i][j]<<" ";
while (indi<=indj){
//cout<<indi<<" "<<indj<<" "<<lcif[indi+1][indj-1]<<'\n';
if (indi==indj){res[++k]=s[indi];break;}
res[++k]=s[indi];
int indi2=Right[indi][lcif[indi+1][indj-1]];
int indj2=Left [indj] [lcif[indi+1][indj-1]];
indi=indi2;
indj=indj2;
//cout<<indi<<" "<<indj<<'\n';
}
//cout<<result<<'\n';
// cout<<indi<<" "<<indj<<'\n';
/*
for(i=0;i<n;++i,cout<<'\n')
for(j=0;j<n;++j) cout<<dp[i][j]<<" ";
cout<<'\n';
for(i=0;i<n;++i,cout<<'\n')
for(j=0;j<n;++j) cout<<lcif[i][j]<<" ";
*/
//cout<<'\n'<<result<<'\n'<<"!!";
//cout<<'\n'<<result<<" "<<k<<'\n';
for(i=1;i<=k;++i) g<<res[i];
if (result%2) st=k-1; else st=k;
if (result>1) for(;st>0;--st) g<<res[st];
return 0;
}