Cod sursa(job #2470386)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 9 octombrie 2019 09:26:42
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb

#include <bits/stdtr1c++.h>

using namespace std;

const int DELTA = 10, MAXN = 2001;

int prv[DELTA][1 + MAXN + 1], nxt[DELTA][1 + MAXN + 1];
short dp[MAXN + 1][MAXN + 1];
int n;
char s[1 + MAXN + 1];
inline void prec () {
  int i, j;
  for (j = 0; j < DELTA; j++)
    nxt[j][n + 1] = n + 1;
  for (i = n; i >= 1; i--) {
    for (j = 0; j < DELTA; j++)
      nxt[j][i] = nxt[j][i + 1];
    nxt[s[i] - '0'][i] = i;
  }
  for (i = 1; i <= n; i++) {
    for (j = 0; j < DELTA; j++)
      prv[j][i] = prv[j][i - 1];
    prv[s[i] - '0'][i] = i;
  }
}

void solve (int st, int dr, int l) {
  int i;
  if (st > dr)
    return;
  for (i = DELTA - 1; i >= 0; i--)
    if (dp[nxt[i][st]][prv[i][dr]] == l) {
      printf ("%d", i);
      solve (nxt[i][st] + 1, prv[i][dr] - 1, l - 2);
      if (l >= 2)
        printf ("%d", i);
      return;
    }
}

int main() {
  int i, l, mx;
  freopen ("elimin2.in", "r", stdin);
  freopen ("elimin2.out", "w", stdout);
  scanf ("%s", s + 1);
  n = strlen (s + 1);
  prec ();
  for (i = 1; i <= n; i++)
    dp[i][i] = 1;
  for (l = 2; l <= n; l++)
    for (i = 1; i + l - 1 <= n; i++)
      if (s[i] == s[i + l - 1])
        dp[i][i + l - 1] = dp[i + 1][i + l - 2] + 2;
      else
        dp[i][i + l - 1] = max (dp[i][i + l - 2], dp[i + 1][i + l - 1]);
  mx = 0;
  for (i = 1; i < DELTA; i++)
    mx = max (mx, (int) dp[nxt[i][1]][prv[i][n]]);
  solve (1, n, mx);
}