Cod sursa(job #37080)

Utilizator dominoMircea Pasoi domino Data 24 martie 2007 16:36:05
Problema Elimin 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <stdio.h>
#include <string>

using namespace std;

#define MAX_N 2048
#define FIN "elimin2.in"
#define FOUT "elimin2.out"

short N, L[MAX_N][10], R[MAX_N][10]; char S[MAX_N];
short A[MAX_N][MAX_N]; string Res;

string trace(int l, int r)
{
    string ret = "";
    int i, t;

    if (l == r) { ret = S[l]; return ret; }
    if (l+1 == r) 
    {
        if (A[l][r] == 2) ret = S[l], ret += S[r]; 
        if (A[l][r] == 1) ret = max(S[l], S[r]);
        return ret;
    }
    if (A[l][r] == 1)
    {
       ret = S[l];
       for (i = l+1; i <= r; i++)
           if (ret[0] < S[i]) ret = S[i];
       return ret;
    }
    t = R[r][S[l]-'0'];
    if (t > l && A[l][r] == A[l+1][t-1]+2)
    {
        ret = S[l];
        ret += trace(l+1, t-1);
        ret += S[l];
        return ret;
    }
    t = L[l][S[r]-'0'];
    if (t < r && A[l][r] == A[t+1][r-1]+2)
    {
        ret = S[r];
        ret += trace(t+1, r-1);
        ret += S[r];
        return ret;
    }
    return trace(l+1, r-1);
}

int main(void)
{
    int i, j, d;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%s", S);
    N = strlen(S);

    for (i = 0; i < 10; i++) L[N][i] = N;
    for (i = N-1; i >= 0; i--)
        for (j = 0; j < 10; j++)
            L[i][j] = S[i] == j+'0' ? i : L[i+1][j];

    for (i = 0; i < 10; i++) R[0][i] = S[0] == i+'0' ? 0 : -1;
    for (i = 1; i < N; i++)
        for (j = 0; j < 10; j++)
            R[i][j] = S[i] == j+'0' ? i : R[i-1][j];

    for (i = 0; i < N; i++) A[i][i] = 1;
    for (i = 0; i+1 < N; i++) A[i][i+1] = (S[i] == S[i+1])<<1 ? 2 : 1;
    for (d = 2; d < N; d++)
        for (i = 0; i+d < N; i++)
        {
            j = i+d;
            if (S[i] == S[j])
                A[i][j] = A[i+1][j-1]+2;
            else
                A[i][j] = max(A[i+1][j], A[i][j-1]);
        }

    Res = trace(0, N-1);
    while (Res[0] == '0' && Res[Res.size()-1] == '0')
          Res = Res.substr(1, Res.size()-2);
    if (Res == "0") Res = "";
    printf("%s\n", Res.c_str());

    return 0;
}