Cod sursa(job #2130143)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 13 februarie 2018 14:40:31
Problema Elimin 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <deque>

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

using namespace std;

FILE*IN=fopen("elimin2.in","r"),*OUT=fopen("elimin2.out","w");

char str[MaxN],best,b[MaxN][MaxN];
short d[MaxN][MaxN];
int N,s,e,Max=1;
void Solve(int s,int e)
{
    char ch=str[s];
    fprintf(OUT,"%c",ch);
    s++,e--;
    while(b[s][e]!=str[s])
        s++;
    while(b[s][e]!=str[e])
        e--;
    if(d[s][e]>1)
        Solve(s,e);
    else if(d[s][e]==1)
        fprintf(OUT,"%c",str[s]);
    fprintf(OUT,"%c",ch);
}
int main()
{
    fscanf(IN,"%s",str+1);
    N=strlen(str+1);
    for(int i=1;i<=N;i++)
    {
        d[i][i]=1;
        b[i][i]=str[i];
        if(str[i]>best)
        {
            best=str[i];
            s=e=i;
        }
    }
    for(int l=1;l<N;l++)
        for(int r=1;r<=N-l;r++)
        {
            int i=r,j=r+l;
            d[i][j]=d[i+1][j];
            b[i][j]=b[i+1][j];
            if(d[i][j-1]>d[i][j]||(d[i][j-1]==d[i][j]&&b[i][j]<b[i][j-1]))
            {
                d[i][j]=d[i][j-1];
                b[i][j]=b[i][j-1];
            }
            if(str[i]==str[j])
            {
                d[i][j]=2+d[i+1][j-1];
                b[i][j]=str[i];
            }
            if(d[i][j]>Max||(str[i]==str[j]&&((l>e-s&&best==str[i])||best<str[i])&&d[i][j]==Max))
            {
                Max=d[i][j];
                s=i;
                e=j;
                best=str[i];
            }
        }
    if(Max==1)
        fprintf(OUT,"%c",str[s]);
    else Solve(s,e);
    return 0;
}