Cod sursa(job #2001722)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 17 iulie 2017 15:48:40
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<fstream>
#include<cstring>
using namespace std;
int n, i, j, st, dr, p, u, lg, m;
char s[2005];
short d[2005][2005], prev[2005][11], nxt[2005][11], sol[2005], maxim;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
int main(){
    fin>> s + 1;
    n = strlen(s + 1);
    for(i = 1; i <= n; i++){
        d[i][i] = 1;
    }
    maxim = 1;
    for(lg = 2; lg <= n; lg++){
        for(i = 1; i <= n - lg + 1; i++){
            j = i + lg - 1;
            if(s[i] == s[j]){
                d[i][j] = 2 + d[i + 1][j - 1];
                if(s[i] != '0'){
                    maxim = max(maxim, d[i][j]);
                }
            }
            else{
                d[i][j] = max(d[i + 1][j], d[i][j - 1]);
            }
        }
    }
    for(i = 1; i <= n; i++){
        s[i] -= '0';
    }
    for(i = 1; i <= n; i++){
        for(j = 0; j < 10; j++){
            if(s[i] == j){
                prev[i][j] = i;
            }
            else{
                prev[i][j] = prev[i - 1][j];
            }
        }
    }
    for(i = n; i >= 1; i--){
        for(j = 0; j < 10; j++){
            if(s[i] == j){
                nxt[i][j] = i;
            }
            else{
                nxt[i][j] = nxt[i + 1][j];
            }
        }
    }
    p = st = 1;
    dr = n;
    u = maxim;
    m = maxim;
    while(p <= u){
        for(i = 9; i >= 0; i--){
            if(d[ nxt[st][i] ][ prev[dr][i] ] >= maxim){
                sol[p] = sol[u] = i;
                p++;
                u--;
                st = nxt[st][i] + 1;
                dr = prev[dr][i] - 1;
                maxim -= 2;
                break;
            }
        }
    }
    for(i = 1; i <= m; i++){
        fout<< sol[i];
    }
    return 0;
}