Cod sursa(job #978330)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 28 iulie 2013 17:28:16
Problema Elimin 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 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;
}