Cod sursa(job #930748)

Utilizator lianaliana tucar liana Data 27 martie 2013 19:59:42
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include<stdio.h>
#include<cstring>
using namespace std;
#define nmax 2005
long c, i, n, ult[11], p, lgmax, poz, v[nmax], nc, inc, sf, sfan, incan, l, j, p1, p2, lgac;
short ant[nmax][11], urm[nmax][11], lg[nmax][nmax];
char s[nmax];

void init()
{
    for (c=0;c<=9;c++)
        ult[c]=-5;
    for (i=0;i<n;i++)
    {
        for (c=0;c<=9;c++)
            ant[i][c]=ult[c];
        ult[s[i]-'0']=i;
    }
    for (c=0;c<=9;c++)
        ult[c]=-5;
    for (i=n-1;i>=0;i--)
    {
        for (c=0;c<=9;c++)
            urm[i][c]=ult[c];
        ult[s[i]-'0']=i;
    }
    for (i=0;i<=n;i++)
        for (j=i;j<=n;j++)
            lg[i][j]=lg[j][i]=-5;
    lgmax=1;
    for (i=0;i<n;i++)
    {
        lg[i][i]=1;
        if (urm[i][s[i]-'0']>-5)
        {
            lg[i][urm[i][s[i]-'0']]=2;
            if (s[i]!='0')
                lgmax=2;
        }
    }
}

void calculare()
{
    for (l=2;l<=n;l++)
        for (i=0;i+l-1<n;i++)
        {
            j=i+l-1;
            if ((s[i]==s[j])&&(lg[i][j]<lg[i+1][j-1]+2)&&(lg[i+1][j-1]>-5))
            {
                lg[i][j]=lg[i+1][j-1]+2;
                 if ((lg[i][j]>lgmax)&&(s[i]>'0'))
                    lgmax=lg[i][j];
            }

            if (lg[i][j]<lg[i+1][j])
                lg[i][j]=lg[i+1][j];

            if (lg[i][j]<lg[i][j-1])
                lg[i][j]=lg[i][j-1];
        }
}

void afisare()
{
    for (c=9;c>=1;c--)
    {
        inc=urm[0][c];
        if (c==s[0]-'0')
            inc=0;
        if (inc>-5)
        {
            sf=ant[n-1][c];
            if (s[n-1]-'0'==c)
                sf=n-1;
            if (lg[inc][sf]==lgmax)
            {
                printf("%ld",c);
                v[++nc]=c;
                break;
            }
        }
    }
    lgac=lgmax-2;
    while (lgac>0)
    {
        sfan=sf;    incan=inc;
        for (c=9;c>=0;c--)
        {
            inc=urm[incan][c];  sf=ant[sfan][c];
            if ((inc>-5)&&(inc<=sf))
                if (lg[inc][sf]==lgac)
                {
                    printf("%ld",c);    v[++nc]=c;
                    break;
                }
        }
        lgac-=2;
    }
    if (lgmax%2==0)
        printf("%ld",v[nc]);
    nc--;
    while (nc>0)
    {   printf("%ld",v[nc]); nc--;   }
}

int main()
{
    freopen("elimin2.in","r",stdin);
    freopen("elimin2.out","w",stdout);
    gets(s);    n=strlen(s);
    init();
    calculare();
    afisare();
 //   printf("\n%ld",lgmax);
    return 0;
}