Cod sursa(job #559781)

Utilizator SpiderManSimoiu Robert SpiderMan Data 18 martie 2011 06:27:53
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
# include <cstdio>
# include <cstring>

const char *FIN = "elimin2.in", *FOU = "elimin2.out" ;
const int MAX = 2005, CAX = 10 ;

char S[MAX], sol[MAX] ;
short L[MAX][MAX], LEFT[MAX][CAX], RIGHT[MAX][CAX] ;
int N ;

inline int max ( int A, int B ) {
    return ( A > B ? A : B ) ;
}

int main ( void ) {
    fscanf ( fopen ( FIN, "r" ) , "%s", S ), N = strlen ( S ) ;

    for ( int i = 0; i < CAX; ++i ) {
        LEFT[N][i] = N, RIGHT[0][i] = ( S[0] - '0' == i ? 0 : -1 ) ;
    }
    for ( int i = N - 1; i + 1; --i ) {
        for ( int j = 0; j < CAX; ++j ) {
            LEFT[i][j] = ( S[i] - '0' == j ? i : LEFT[i + 1][j] ) ;
        }
    }
    for ( int i = 1; i < N; ++i ) {
        for ( int j = 0; j < CAX; ++j ) {
            RIGHT[i][j] = ( S[i] - '0' == j ? i : RIGHT[i - 1][j] ) ;
        }
    }
    for ( int i = 0; i + 1 < N; ++i ) {
        L[i][i] = 1, L[i][i + 1] = 1 + ( S[i] == S[i + 1] ) ;
    }
    L[N - 1][N - 1] = 1 ;
    for ( int c = 2; c < N; ++c ) {
        for ( int i = 0; i + c < N; ++i ) {
            L[i][i + c] = ( S[i] == S[i + c] ? L[i + 1][i + c - 1] + 2 : max ( L[i][i + c - 1], L[i + 1][i + c] ) ) ;
        }
    }
    for ( int i = 0, j = N - 1, k = 0; i <= j; ) {
        for ( int c = CAX - 1; c + 1; --c ) {
            int l = LEFT[i][c], r = RIGHT[j][c] ;
            if ( l <= r && L[i][j] == L[l + 1][r - 1] + ( l != r ) + 1 ) {
                sol[k] = sol[L[0][N - 1] - k - 1] = c + '0' ;
                i = l + 1, j = r - 1, ++k ;
                break ;
            }
        }
    }
    int ii, jj ;
    for ( ii = 0, jj = L[0][N - 1] - 1; ii <= jj && sol[ii] == '0' && sol[jj] == '0' ; ++ii, --jj ) ;
    freopen ( FOU, "w", stdout ) ;
    for ( int i = ii; i <= jj; ++i ) {
        printf ( "%c", sol[i] ) ;
    }
}