Cod sursa(job #2002075)

Utilizator Bodo171Bogdan Pop Bodo171 Data 18 iulie 2017 16:05:30
Problema Elimin 2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>
using namespace std;
short best[2005][2005],lst[2005][10],fst[2005][10];
short mx;
bool afis[2005];
string s;
int len,i,j,l,maxim,st,dr,r,L;
bool brk;
int main()
{
    ifstream f("elimin2.in");
    ofstream g("elimin2.out");
    f>>s;len=s.size();
    s=' '+s;
    for(i=1;i<=len+1;i++)
    {
        for(j=0;j<10;j++)
            if(!lst[i][j])
                lst[i][j]=lst[i-1][j];
        if(i<=len)lst[i+1][s[i]-'0']=i;
    }
    for(i=len;i>=0;i--)
    {
        for(j=0;j<10;j++)
            if(!fst[i][j])
            fst[i][j]=fst[i+1][j];
        if(i>0)fst[i-1][s[i]-'0']=i;
    }
    for(i=1;i<=len;i++)
        best[1][i]=1;
    maxim=1;
    for(l=2;l<=len;l++)
        for(i=1;i<=len-l+1;i++)
    {
       best[i][l]=max(best[l-1][i],best[l-1][i+1]);
       if(s[i]==s[i+l-1]&&best[l-2][i+1]+2>best[l][i])
       {
           best[l][i]=best[l-2][i+1]+2;
           if(s[i]!='0'&&best[l][i]>maxim)
              maxim=best[l][i];
       }
    }
    L=maxim;l=0;r=len+1;
    while(L>0)
    {
        brk=0;
        for(j=9;j>=0&&brk==0;j--)
        {
            st=fst[l][j];dr=lst[r][j];
            if(st<=dr&&best[dr-st+1][st]==L)
            {
                brk=1;
                afis[st]=afis[dr]=1;
                l=st;r=dr;L-=2;
            }
        }
    }
    for(i=1;i<=len;i++)
        if(afis[i])
          g<<s[i];
    return 0;
}