Pagini recente » Cod sursa (job #841630) | Cod sursa (job #418720) | Cod sursa (job #1394567) | Cod sursa (job #392868) | Cod sursa (job #2001725)
#include<fstream>
#include<cstring>
using namespace std;
int n, i, j, st, dr, p, u, lg, m;
char s[2005];
short d[2005][2005], lst[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){
lst[i][j] = i;
}
else{
lst[i][j] = lst[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] ][ lst[dr][i] ] >= maxim){
sol[p] = sol[u] = i;
p++;
u--;
st = nxt[st][i] + 1;
dr = lst[dr][i] - 1;
maxim -= 2;
break;
}
}
}
for(i = 1; i <= m; i++){
fout<< sol[i];
}
return 0;
}