Cod sursa(job #2035896)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 9 octombrie 2017 22:06:49
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>

#define MaxN 2005
#define INF 2140000000
#define MOD 1000000007

using namespace std;

FILE*IN,*OUT;

short N,S;
struct dynamic
{
    short L;
    char Digit;
    pair<short,short>to;
}d[MaxN][MaxN];
char str[MaxN],out[MaxN],Stack[MaxN];
bool comp(dynamic a,dynamic b)
{
    return a.L<b.L||(a.L==b.L&&a.Digit<b.Digit);
}
void Solve(short i,short j)
{
    short x,y;
    while(i!=-1&&j!=-1)
    {
        if(d[i][j].L>1)
            Stack[++S]=d[i][j].Digit;
        fprintf(OUT,"%c",d[i][j].Digit);
        x=d[i][j].to.first;
        y=d[i][j].to.second;
        i=x,j=y;
    }
    for(int i=S;i>0;i--)
        fprintf(OUT,"%c",Stack[i]);
}
int main()
{
    IN=fopen("elimin2.in","r");
    OUT=fopen("elimin2.out","w");

    fscanf(IN,"%s",str);
    N=strlen(str);
    for(int i=0;i<N;i++)
    {
        d[i][i].L=1;
        d[i][i].Digit=str[i];
        d[i][i].to={-1,-1};
    }
    for(int D=1;D<N;D++)
        for(int i=0;i<N-D;i++)
        {
            d[i][i+D]=d[i][i+D-1];
            if(comp(d[i][i+D],d[i+1][i+D]))
                d[i][i+D]=d[i+1][i+D];
            if(str[i]==str[i+D])
            {
                dynamic t=d[i+1][i+D-1];
                t.L+=2;
                t.Digit=str[i];
                if(i+1>i+D-1)
                    t.to={-1,-1};
                else t.to={i+1,i+D-1};
                if(comp(d[i][i+D],t))
                    d[i][i+D]=t;
            }
        }
    Solve(0,N-1);
    return 0;
}