Cod sursa(job #1796798)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 3 noiembrie 2016 19:50:53
Problema Elimin 2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#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;
}