Cod sursa(job #44951)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 31 martie 2007 20:50:14
Problema Elimin 2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <stdio.h>
#include <string>

#define maxn 2010
#define maxl 4
#define maxc 9
#define maxv 10000

char a[maxn];
int p[maxn];
int n;
short c[maxl][maxn],d[maxl][maxn];
short from[maxn][maxn];
char sol[maxn];
int q[maxc],r[maxc],b[maxc];

int main()
{
	freopen("elimin2.in","r",stdin);
	freopen("elimin2.out","w",stdout);

	int i,j,x,y,k,aux,max=0;
	fgets(a,maxn,stdin);
	n=strlen(a)-2;
	
	for (i=maxc;i>0;i--)
	{
        for (j=0;j<=n;j++)
          if (a[j]-'0'==i) break;
          
        for (k=n;k>=0;k--)
          if (a[k]-'0'==i) break;
          
        q[i]=j;
        r[i]=k+1-j;
    }

	p[0]=0;
	
	for (i=1;i<=n+1;i++)
	{
		p[i]=p[i-1]+1;
		if (p[i]==maxl) p[i]=0;
	}

	for (i=0;i<maxl;i++)
	  for (j=0;j<=n;j++) c[i][j]=maxv;

	for (i=0;i<=n;i++)
	  for (j=0;j<=n;j++) from[i][j]=maxv;

	for (i=0;i<=n;i++)
    {
		c[1][i]=0;
		d[1][i]=a[i]-'0';
	}

	for (i=0;i<n;i++)
	  if (a[i]==a[i+1])
	  {
		   c[2][i]=0;
		   d[2][i]=a[i]-'0';
      }
	  else c[2][i]=2;

	for (i=1;i<=n+1;i++)
	{
	  for (x=0;x<=n;x++)
	  {
		  if (i+2<=n+1) c[p[i+2]][x]=maxv;
		  if (i+3<=n+1) c[p[i+3]][x]=maxv;
	  }

	  for (x=0;x+i-1<=n;x++)
      {
		  y=i+x-1;
          if ((x>0) && (y<n) && (a[x-1]==a[y+1]) && ((c[p[i]][x]<c[p[i+2]][x-1]) || ((c[p[i]][x]==c[p[i+2]][x-1]) && (a[x-1]-'0'>d[p[i+2]][x-1]))))
          {
                    c[p[i+2]][x-1]=c[p[i]][x];
                    d[p[i+2]][x-1]=a[x-1]-'0';
                    from[i+2][x-1]=i;
          }   
          if ((x>0) && ((c[p[i]][x]+1<c[p[i+1]][x-1]) || ((c[p[i]][x]+1==c[p[i+1]][x-1]) && (d[p[i]][x]>d[p[i+1]][x-1]))))
          {
                    c[p[i+1]][x-1]=c[p[i]][x]+1;
                    d[p[i+1]][x-1]=d[p[i]][x];
					from[i+1][x-1]=-i;
          }
          if ((y<n) && ((c[p[i]][x]+1<c[p[i+1]][x]) || ((c[p[i]][x]+1==c[p[i+1]][x]) && (d[p[i]][x]>d[p[i+1]][x]))))
          {
                    c[p[i+1]][x]=c[p[i]][x]+1;
                    d[p[i+1]][x]=d[p[i]][x];
                    from[i+1][x]=i;
          }          
      }
      
	  for (j=1;j<=maxc;j++)
        if (i==r[j]) b[j]=c[p[i]][q[j]];
	}
	
	for (i=maxc;i>0;i--)
	  if (r[i]-b[i]>max)
	  {
		  max=r[i]-b[i];
		  x=q[i];
		  y=x+r[i]-1;
	  }

	i=y+1-x;
	j=0;
	k=max-1;

	while (i!=maxv)
	{
		aux=from[i][x];
		if (aux>=0)
		  if ((i-aux==2) || (aux==maxv))
		  {
			  sol[j++]=a[x++];
			  sol[k--]=a[y--];
		  }
		  else y--;
		else x++;
		if (aux>=0) i=aux;
		else i=-aux;
	}

	for (i=0;i<max;i++) printf("%c",sol[i]);
	printf("\n");
          
	return 0;
}