Cod sursa(job #757334)

Utilizator danalex97Dan H Alexandru danalex97 Data 11 iunie 2012 20:59:02
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>
#include <cstring>
using namespace std;

#define max(a, b) ((a) > (b) ? (a) : (b))

#define MAX_N 2011

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

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

#define Aux int
Aux i, j, c, d, l, r, len;
#undef Aux

#undef MAX_N

int main(void)
{
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);
	
	#undef FIN
	#undef FOUT

    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] ? 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]);
        }

    for (i = 0, j = N-1, d = 0, len = A[0][N-1]; i <= j; )
        for (c = 9; c >= 0; c--)
        {
            l = L[i][c]; r = R[j][c];
            if (l <= r && A[i][j] == A[l+1][r-1]+1+(l<r))
            {
                Res[d] = Res[len-d-1] = c+'0';
                i = l+1, j = r-1, d++;
                break;
            }
        }

    for (i = 0, j = len-1; i <= j && Res[i] == '0' && Res[j] == '0'; i++, j--);
    for (d = i; d <= j; d++) printf("%c", Res[d]); printf("\n");
}