Pagini recente » Istoria paginii utilizator/nst06 | Statistici claudia (Soare_Claudia) | Istoria paginii utilizator/raduspower | Cod sursa (job #888965) | Cod sursa (job #1796798)
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 2050
#define MAXC 12
using namespace std;
char s[MAXN]=" ";
int n, nxt[MAXN][MAXC], prv[MAXN][MAXC];
int din[MAXN][MAXN];
void prepare()
{
for (int i = n; i >= 1; i--) {
for (int j = 0; j < MAXC; j++)
nxt[i][j] = nxt[i+1][j];
nxt[i][s[i]-'0'] = i;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < MAXC; j++)
prv[i][j] = prv[i-1][j];
prv[i][s[i]-'0'] = i;
}
}
void traseu(int st, int dr)
{
int x, y, need=-1;
for (int i = 0; i <= 10; i++)
if (din[nxt[st+1][i]][prv[dr-1][i]] >= need) {
x = nxt[st+1][i];
y = prv[dr-1][i];
need = din[x][y];
}
if (need < 1) return;
printf("%c", s[x]);
if (need < 2)
return;
traseu(x, y);
printf("%c", s[x]);
}
void solve()
{
for (int i = 1; i <= n; i++)
din[i][i] = 1;
for (int len = 2; len <= n; len++) {
for (int st = 1; st+len-1 <= n; st++) {
int dr = st+len-1;
if (s[st] == s[dr]) din[st][dr] = din[st+1][dr-1]+2;
else din[st][dr] = -1;
din[st][dr] = max(din[st][dr], din[st+1][dr]);
din[st][dr] = max(din[st][dr], din[st][dr-1]);
}
}
int x, y, need = -1;
for (int i = 1; i < 10; i++)
if (din[nxt[1][i]][prv[n][i]] >= need) {
x = nxt[1][i];
y = prv[n][i];
need = din[x][y];
}
if (need < 2) {
printf("%c", s[x]);
return;
}
printf("%c", s[x]);
traseu(x, y);
printf("%c", s[x]);
}
int main()
{
freopen("elimin2.in", "r", stdin);
freopen("elimin2.out", "w", stdout);
gets(s+1);
n = strlen(s+1);
prepare();
solve();
return 0;
}