Cod sursa(job #2039345)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 14 octombrie 2017 14:27:53
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <bits/stdc++.h>

#define MaxN 2005
#define INF 2140000000
#define MOD 1000000007
#define Next(i,j) D[N+1-i][N+2-j]

using namespace std;

FILE*IN,*OUT;

short N,D[MaxN][MaxN];
char str[MaxN],ch[MaxN][MaxN];
void Solve(int i,int j)
{
    fprintf(OUT,"%c",ch[i][j]);
    if(D[i][j]==1)
        return;
    if(D[i][j]==2)
    {
        fprintf(OUT,"%c",ch[i][j]);
        return;
    }
    int p=j,k=Next(i,j);
    while(str[k]!=str[p])
        p--;
    Solve(k,p);
    fprintf(OUT,"%c",ch[i][j]);
}
bool Check(int x,int y,int i,int j,char c)
{
    return D[x][y]+2>D[i][j]||(D[x][y]+2==D[i][j]&&c>ch[i][j]);
}
void Copy(int x,int y,int i,int j)
{
    D[x][y]=D[i][j];
    ch[x][y]=ch[i][j];
    Next(x,y)=Next(i,j);
}
bool Bigger(int x,int y,int i,int j)
{
    return D[x][y]>D[i][j]||(D[x][y]==D[i][j]&&ch[x][y]>ch[i][j]);
}
void Move(int x,int y,int i,int j,char c)
{
    if(i>j)
    {
        D[x][y]=2;
        ch[x][y]=c;
        Next(x,y)=-1;
    }
    else
    {
        D[x][y]=2+D[i][j];
        ch[x][y]=c;
        Next(x,y)=i;
    }
}
int main()
{
    IN=fopen("elimin2.in","r");
    OUT=fopen("elimin2.out","w");

    fscanf(IN,"%s",str+1);
    N=strlen(str+1);

    for(int i=1;i<=N;i++)
        D[i][i]=1,ch[i][i]=str[i],Next(i,i)=-1;
    for(int d=1;d<N;d++)
        for(int i=1;i<=N-d;i++)
        {
            Copy(i,i+d,i,i+d-1);
            if(Bigger(i+1,i+d,i,i+d))
                Copy(i,i+d,i+1,i+d);
            if(str[i]==str[i+d])
                if(Check(i+1,i+d-1,i,i+d,str[i]))
                    Move(i,i+d,i+1,i+d-1,str[i]);
        }
    Solve(1,N);
    return 0;
}