Cod sursa(job #930594)

Utilizator crushackPopescu Silviu crushack Data 27 martie 2013 18:53:12
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMax 2010
using namespace std;

const char IN[]="elimin2.in",OUT[]="elimin2.out";

int N;
short T[NMax][NMax],first[NMax][10],last[NMax][10];
char s[NMax];

void write(int x,int y){

	if (x>y || !x) return;
	if (x==y){
		printf("%c",s[x]);
		return;
	}

	if (s[x]==s[y]) printf("%c",s[x]);

	for (int c=9;c>=0;--c)if (T[first[x+1][c]][last[y-1][c]]+2==T[x][y])
	{
		write(first[x+1][c],last[y-1][c]);
		break;
	}

	if (s[x]==s[y]) printf("%c",s[x]);
}

int main()
{
	int i,j,k,x,y;
	freopen(IN,"r",stdin);
	scanf("%s",s+1);
	fclose(stdin);

	N=strlen(s+1);

	for (i=1;i<=N;++i) {
		for (j=0;j<10;++j) last[i][j]=last[i-1][j];
		last[i][s[i]-'0']=i;
	}

	for (i=N;i>0;--i){
		for (j=0;j<10;++j) first[i][j]=first[i+1][j];
		first[i][s[i]-'0']=i;
	}

	for (i=1;i<=N;++i) T[i][i]=1;

	for (i=x=1;i<=N;++i) if (s[i]>s[x]) x=i;y=x;
	for (k=2;k<=N;++k)
		for (i=1;i+k-1<=N;++i){
			j=i+k-1;
			if (s[i]==s[j]) T[i][j]=T[i+1][j-1]+2;
			else T[i][j]=max(T[i+1][j],T[i][j-1]);
		}

	for (i=10;i>0;--i) if (T[first[1][i]][last[N][i]]>T[x][y]) x=first[1][i],y=last[N][i];
	freopen(OUT,"w",stdout);
	write(x,y);printf("\n");
	fclose(stdout);
	return 0;
}