Cod sursa(job #930628)

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

void init()
{
    for (c=0;c<=9;c++)
        ult[c]=-1;
    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]=-1;
    for (i=n-1;i>=0;i--)
    {
        for (c=0;c<=9;c++)
            urm[i][c]=ult[c];
        ult[s[i]-'0']=i;
    }
    lgmax=1;
    for (i=0;i<n;i++)
    {
        pmin[i][1]=i;
        pmin[i][2]=urm[i][s[i]-'0'];
        if (pmin[i][2]>-1)
            lgmax=2;
    }
}

void calculare()
{
    for (lg=3;lg<=n;lg++)
        for (i=0;i<n;i++)
            pmin[i][lg]=-1;
    for (lg=3;lg<=n;lg++)
    {
        for (i=0;i+lg-1<n;i++)
        {
            for (c=0;c<=9;c++)
            {
                p1=urm[i][c];
                if (p1>-1)
                    p2=pmin[p1][lg-2];
                if ((p1>-1)&&(p2>-1))
                    if (urm[p2][s[i]-'0']>-1)
                        if ((pmin[i][lg]==-1)||(pmin[i][lg]>urm[p2][s[i]-'0']))
                            pmin[i][lg]=urm[p2][s[i]-'0'];
            }
            if ((pmin[i][lg]>-1)&&(lg>lgmax)&&(s[i]!='0'))
                lgmax=lg;
        }
    }
}

void afisare()
{
   // urm[0][s[0]-'0']=0;
    for (c=9;c>=1;c--)
    {
        p1=urm[0][c];
        if (c==s[0]-'0')
            p1=0;
        if (p1>-1)
            if (pmin[p1][lgmax]>-1)
            {
                printf("%ld",c); poz=p1;
                v[++nc]=c;
                break;
            }
    }
    inc=poz;    sf=ant[n-1][s[inc]-'0'];
    if (s[inc]==s[n-1])
        sf=n-1;
    lg=lgmax-2;
    while (lg>0)
    {
        sfan=sf;    incan=inc;
        for (c=9;c>=0;c--)
        {
            p1=urm[incan][c];
            if (p1>-1)
                if ((pmin[p1][lg]>-1)&&(pmin[p1][lg]<sfan))
                {
                    printf("%ld",c);    inc=p1; sf=ant[sfan][s[p1]-'0'];
                    v[++nc]=c;
                    break;
                }
        }
        lg-=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;
}