Cod sursa(job #1319566)

Utilizator wGEORGEWGeorge Cioti wGEORGEW Data 17 ianuarie 2015 08:25:43
Problema Elimin 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#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;
}