Pagini recente » Cod sursa (job #938525) | Cod sursa (job #2475764) | Cod sursa (job #1295285) | Cod sursa (job #393604) | Cod sursa (job #2001169)
#include <bits/stdc++.h>
using namespace std;
const int SIGMA = 1e1 + 0;
const int NMAX = 2e3 + 5;
char str[NMAX]; short dp[NMAX][NMAX];
int nxt[SIGMA][NMAX], prv[SIGMA][NMAX];
void solve(int le, int ri, int len)
{
if (le > ri)
return;
for (int i = SIGMA - 1; i >= 0; --i) {
if (dp[nxt[i][le]][prv[i][ri]] != len)
continue;
printf("%d", i);
solve(nxt[i][le] + 1, prv[i][ri] - 1, len - 2);
if (len >= 2)
printf("%d", i);
return;
}
return;
}
int main(void)
{
freopen("elimin2.in" , "r", stdin );
freopen("elimin2.out", "w", stdout);
scanf("%s", str + 1);
int n = (int) strlen(str + 1);
for (int j = 0; j < SIGMA; ++j)
nxt[j][n + 1] = n + 1;
for (int i = 1; i <= n; ++i)
dp[i][i] = 1;
for (int i = n; i >= 1; --i) {
for (int j = 0; j < SIGMA; ++j)
nxt[j][i] = nxt[j][i + 1];
nxt[str[i] - '0'][i] = i;
}
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < SIGMA; ++j)
prv[j][i] = prv[j][i - 1];
prv[str[i] - '0'][i] = i;
}
for (int l = 2; l <= n; ++l) {
for (int i = 1, j = l; j <= n; ++i, ++j) {
if (str[i] == str[j])
dp[i][j] = 2 + dp[i + 1][j - 1];
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
} }
int len = 0;
for (int i = 1; i < SIGMA; ++i)
len = max(len, (int) dp[nxt[i][1]][prv[i][n]]);
solve(1, n, len);
return 0;
}