Pagini recente » Cod sursa (job #1278996) | Cod sursa (job #1047634) | Cod sursa (job #334627) | Cod sursa (job #1409498) | Cod sursa (job #1501877)
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxN 2002
#define maxD 10
using namespace std;
int n, i, j, x, y;
short int dp[maxN][maxN], v[maxN], posi[maxN][maxD], posj[maxN][maxD];
char s[maxN], dig;
struct interv
{
short int x;
short int y;
}er[maxN][maxN];
bool erased[maxN];
void read()
{
freopen("elimin2.in", "r", stdin);
gets(s + 1);
n = strlen(s + 1);
}
void solve()
{
for (i = 1; i <= n; ++ i)
for (dig = '0'; dig <= '9'; ++ dig)
{
j = i + 1;
while (s[j] != dig && j <= n)
++ j;
posi[i][dig - '0'] = j;
}
for (i = 1; i <= n; ++ i)
for (dig = '0'; dig <= '9'; ++ dig)
{
j = i - 1;
while (s[j] != dig && j > 0)
-- j;
posj[i][dig - '0'] = j;
}
er[n][n].x = n + 1;
er[n][n].y = n;
for (i = n; i >= 1; -- i)
for (j = i + 1; j <= n; ++ j)
{
er[i][i].x = i + 1;
er[i][i].y = i;
if (s[i] == s[j])
{
dp[i][j] = dp[i + 1][j - 1];
er[i][j].x = i + 1;
er[i][j].y = j - 1;
}
else
{
dp[i][j] = 2 * maxN;
if ((x = posi[i][s[j] - '0']) <= j && (y = posj[j][s[i] - '0']) >= i && x - i + dp[x][j] == j - y + dp[i][y])
{
if (s[i] < s[x])
er[i][j].x = x,
er[i][j].y = j;
else
er[i][j].x = i,
er[i][j].y = y;
dp[i][j] = x - i + dp[x][j];
}
else
if ((x = posi[i][s[j] - '0']) <= j)
{
er[i][j].x = x;
er[i][j].y = j;
dp[i][j] = x - i + dp[x][j];
}
if ((y = posj[j][s[i] - '0']) >= i && dp[i][j] > j - y + dp[i][y])
{
dp[i][j] = j - y + dp[i][y];
er[i][j].x = i;
er[i][j].y = y;
}
}
}
}
void write()
{
int p;
char c = 0;
freopen("elimin2.out", "w", stdout);
i = 1; j = n;
while (i <= j)
{
x = er[i][j].x;
y = er[i][j].y;
if (i != x && s[i] != s[j])
for (p = i; p < x; ++ p)
erased[p] = 1;
else
if (s[i] != s[j])
for (p = y + 1; p <= j; ++ p)
erased[p] = 1;
i = x;
j = y;
}
i = 1;
while (s[i] == '0' || erased[i])
{
erased[i] = 1;
++ i;
}
i = n;
while (s[i] == '0' || erased[i])
{
erased[i] = 1;
-- i;
}
for (i = 1; i <= n; ++ i)
if (!erased[i] && (s[i] != '0' || c != 0))
{
printf("%c", s[i]);
c = s[i];
}
}
int main()
{
read();
solve();
write();
return 0;
}