Cod sursa(job #46465)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 2 aprilie 2007 17:56:49
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define nmax 2048
#define FOR(i,s,d) for(i=(s);i<(d);++i)

int A[nmax][nmax],L[nmax][16],R[nmax][16],last[16],n,sol;
char s[nmax];

int doit(int a,int b)
{
	if(A[a][b])
		return A[a][b];
	A[a][b]=1;
	if(a==b)
		return A[a][b]=1;
	if(a>b)
		return A[a][b]=0;
	if(s[a]==s[b])
		return A[a][b]=doit(a+1,b-1)+2;
	return A[a][b]=max(doit(a,b-1),doit(a+1,b));
}

int afis(int a,int b,int sol)
{
	int i;
	printf("%c",s[a]);
	if(sol>2)
	{
		for(i=9;i>=0;i--)
			if(L[a+1][i]!=-1&&R[b-1][i]!=-1)
			if(doit(L[a+1][i],R[b-1][i])==sol-2)
				break;
		afis(L[a+1][i],R[b-1][i],sol-2);
	}
	if(b!=a)
		printf("%c",s[b]);
}

int main()
{
	freopen("elimin2.in","r",stdin);
	freopen("elimin2.out","w",stdout);
	int i;
	scanf("%s",s);
	n=strlen(s);
	memset(last,-1,sizeof(last));
	FOR(i,0,n)
	{
		last[s[i]-'0']=i;
		memcpy(R[i],last,sizeof(last));
	}
	memset(last,-1,sizeof(last));
	for(i=n-1;i>=0;--i)
	{
		last[s[i]-'0']=i;
		memcpy(L[i],last,sizeof(last));
	}
	FOR(i,1,10)
		if(L[0][i]!=-1&&R[n-1][i]!=-1)
			sol=max(sol,doit(L[0][i],R[n-1][i]));
	for(i=9;i;--i)
		if(L[0][i]!=-1&&R[n-1][i]!=-1)
		if(A[L[0][i]][R[n-1][i]]==sol)
		{
			afis(L[0][i],R[n-1][i],sol);
			break;
		}
	printf("\n");
	return 0;
}