Cod sursa(job #2001695)

Utilizator robx12lnLinca Robert robx12ln Data 17 iulie 2017 15:23:58
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
short D[2005][2005], Next[2005][10], Prev[2005][10], L, first, last, n;
char s[2005], sol[2005];
inline void solve( int st, int dr, int lg ){
    if( st > dr )
        return;
    if( lg < 0 )
        return;
    for( int i = 9; i >= 0; i-- ){
        if( D[ Next[st][i] ][ Prev[dr][i] ] == lg ){
            sol[first++] = (char)(i + '0');
            sol[last--] = (char)(i + '0');
            solve( Next[st][i] + 1, Prev[dr][i] - 1, lg - 2 );
            return;
        }
    }
    return;
}
int main(){
    fin >> s + 1;
    n = strlen( s + 1 );
    for( int i = 1; i <= n; i++ ){
        for( int j = 0; j <= 9; j++ ){
            Prev[i][j] = Prev[i - 1][j];
        }
        Prev[i][ s[i] - '0' ] = i;
    }
    for( int i = 0; i <= 9; i++ )
        Next[n + 1][i] = n + 1;
    for( int i = n; i >= 1; i-- ){
        for( int j = 0; j <= 9; j++ ){
            Next[i][j] = Next[i + 1][j];
        }
        Next[i][ s[i] - '0' ] = i;
    }
    for( int i = 1; i <= n; i++ )
        D[i][i] = 1;
    for( int lg = 2; lg <= n; lg++ ){
        for( int i = 1; i <= n - lg + 1; i++ ){
            if( s[i] == s[i + lg - 1] ){
                D[i][i + lg - 1] = max( D[i][i + lg - 1], (short)(2 + D[i + 1][i + lg - 2]) );
            }else{
                D[i][i + lg - 1] = max( D[i][i + lg - 1], max( D[i + 1][i + lg - 1], D[i][i + lg - 2] ) );
            }
        }
    }
    for( int i = 1; i <= 9; i++ ){
        L = max( L, D[ Next[1][i] ][ Prev[n][i] ] );
    }
    first = 0;
    last = L - 1;
    solve( 1, n, L );
    fout << sol;
    return 0;
}