Cod sursa(job #1804527)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 12 noiembrie 2016 17:59:09
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("elimin2.in");
ofstream g("elimin2.out");
short i,j,maxi,nm,n,k,v[1<<11],d[1<<11][1<<11],P[1<<11][11],U[1<<11][11];
char s[1<<11];
inline void afis(short x,short y)
{
    if(x>y||!x) return ;
    if(x==y)
    {
        g<<v[x];
        return ;
    }
    if(v[x]==v[y]) g<<v[x];
    for(i=9;i>=0;--i)
    if(d[P[x+1][i]][U[y-1][i]]+2==d[x][y])
    {
        afis(P[x+1][i],U[y-1][i]);
        break;
    }
    if(v[x]==v[y]) g<<v[x];
}
int main()
{
    f>>(s+1);
    n=strlen(s+1);
    for(i=1;i<=n;++i) v[i]=s[i]-'0';
    for(i=1;i<=n;++i)
    {
        for(j=0;j<=9;++j) U[i][j]=U[i-1][j];
        U[i][v[i]]=i;
    }
    for(i=n;i;--i)
    {
        for(j=0;j<=9;++j)
            P[i][j]=P[i+1][j];
        P[i][v[i]]=i;
    }
    for(i=1;i<=n;++i) d[i][i]=1;
    for(k=2;k<=n;++k)
        for(j=k;j<=n;++j)
        {
            i=j-k+1;
            if(v[i]==v[j]) d[i][j]=d[i+1][j-1]+2;
            else d[i][j]=max(d[i+1][j],d[i][j-1]);
        }
    maxi=1;
    for(i=1;i<=n;++i)
        if(v[i]>v[maxi]) maxi=i;
    nm=i;
    for(i=10;i;--i)
        if(d[P[1][i]][U[n][i]]>d[maxi][nm]) maxi=P[1][i],nm=U[n][i];
    afis(maxi,nm);
    return 0;
}