Cod sursa(job #978341)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 28 iulie 2013 17:43:48
Problema Elimin 2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <fstream>
#include <iostream>
using namespace std;
#include <string>
#include <vector>

ifstream f("elimin2.in");
ofstream g("elimin2.out");
//#define f cin
//#define g cout

#define LE 2066
#define sh short int

string s;
int i,j;
sh dp[2][LE];
char lcif[LE][LE];
int result,res[LE],Right[LE][20],Left[LE][20];
int indi,indj,lres,k,st;
string s2;
int l;

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[l][j]=dp[l^1][j-1],lcif[i][j]=lcif[i-1][j-1];
      if (s[i]==s[j]&&i!=j) dp[l][j]=dp[l^1][j-1]+2,lcif[i][j]=s[i];
	  if (i==j) dp[l][j]=1,lcif[i][j]=s[i];
	 
	  if (dp[l^1][j]>dp[l][j]||(dp[l^1][j]==dp[l][j]&&lcif[i+1][j]>lcif[i][j])){
	     dp[l][j]=dp[l^1][j];
		 lcif[i][j]=lcif[i+1][j];
	  }
	 
	 if (dp[l][j-1]>dp[l][j]||(dp[l][j-1]==dp[l][j]&&lcif[i][j-1]>lcif[i][j])){
	    dp[l][j]=dp[l][j-1];
	    lcif[i][j]=lcif[i][j-1];
	  }
	 
	 if (dp[l][j]>result||(result==dp[l][j]&&lcif[i][j]>lres)){
	     result=dp[l][j];
         lres=lcif[i][j];	
	     indi=i,indj=j;
	 }
   }
    l^=1;
	for(j=0;j<n;++j) dp[l][j]=0;
  }
    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;
}