Cod sursa(job #1501867)

Utilizator akaprosAna Kapros akapros Data 13 octombrie 2015 21:53:15
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxN 2002
#define maxD 10
using namespace std;
int n, i, j, x, y, dp[maxN][maxN], v[maxN], posi[maxN][maxD], posj[maxN][maxD];
char s[maxN], dig;
struct interv
{
    int x;
    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;
    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;
    }
    for (i = 1; i <= n; ++ i)
        if (!erased[i])
           printf("%c", s[i]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}