Pagini recente » Cod sursa (job #2798472) | Cod sursa (job #1935778) | Cod sursa (job #1415775) | Cod sursa (job #339449) | Cod sursa (job #1364528)
#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;
}