Cod sursa(job #1364528)

Utilizator retrogradLucian Bicsi retrograd Data 27 februarie 2015 18:26:06
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include<fstream>
#include<algorithm>
#include<string>

using namespace std;
typedef int var;

ifstream fin("elimin2.in");
ofstream fout("elimin2.out");

#define MAXN 2001

string S1, S2;

var DIN[MAXN][MAXN];
vector<char> VAL;
vector<var> G[MAXN*MAXN/5];

struct Sol {
    var l, c, ind;
    Sol(var a, var b, var i) {
        l = a;
        c = b;
        ind = i;
    }
};

vector<Sol> PRET[MAXN];


string minim(var node) {
    string sol;
    for(auto vec : G[node]) {
        string m = minim(vec);
        if(sol < m) {
            sol = m;
        }
    }
    return VAL[node] + sol;
}


int main() {
    fin>>S1;
    S2 = S1;
    VAL.resize(1);
    reverse(S2.begin(), S2.end());

    const var size = S1.size();
    var nr_p = 0;

    for(var i=1; i<=size; i++) {
        for(var j=1; j<=size; j++) {
            if(S1[i-1] == S2[j-1]) {
                VAL.push_back(S1[i-1]);
                DIN[i][j] = DIN[i-1][j-1] + 1;
                PRET[DIN[i][j]].push_back(Sol(i, j, ++nr_p));
            } else {
                DIN[i][j] = max(DIN[i-1][j], DIN[i][j-1]);
            }
        }
    }


/*
    for(var i=1; i<=size; i++) {
        for(var j=1; j<=size; j++) {
            fout<<DIN[i][j]<<" ";
        }
        fout<<endl;
    }*/

    var len = DIN[size][size];
    for(auto p1 : PRET[len]) {
        G[0].push_back(p1.ind);
    }

    var start = 0;
    VAL[start] = '#';

    for(var i=len; i>len/2+1; i--) {
        for(auto p1 : PRET[i]) {
            for( auto p2 : PRET[i-1]) {
                if(p2.l <= p1.l && p2.c <= p1.c) {
                    G[p1.ind].push_back(p2.ind);
                }
            }
        }
    }

    string m = minim(start);
    if(len % 2 == 0) {
        for(var i=1; i<m.size(); i++) fout<<m[i];
        for(var i=m.size()-1; i; i--) fout<<m[i];
    } else {
        for(var i=1; i<m.size(); i++) fout<<m[i];
        for(var i=m.size()-2; i; i--) fout<<m[i];
    }


    return 0;
}