Cod sursa(job #2629913)

Utilizator segtreapMihnea Andreescu segtreap Data 23 iunie 2020 11:31:47
Problema Elimin 2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>

using namespace std;

const int N = 2000 + 7;
int n, c[N], dp[N][N], nxt[N][10], ant[N][10];
string s;

void print(int l, int r) {
  if (l > r) {
    return;
  }
  if (l == r) {
    cout << c[l];
    return;
  }
  if (c[l] == c[r]) {
    cout << c[l];
    print(l + 1, r - 1);
    cout << c[r];
    return;
  }
  for (int x = 9; x >= 0; x--) {
    int p1 = nxt[l][x];
    int p2 = ant[r][x];
    if (p1 > p2) {
      continue;
    }
    if (dp[p1][p2] == dp[l][r]) {
      print(p1, p2);
      return;
    }
  }
}

int main() {
  freopen ("elimin2.in", "r", stdin);
  freopen ("elimin2.out", "w", stdout);
  cin >> s;
  n = (int) s.size();
  for (int i = 1; i <= n; i++) {
    c[i] = s[i - 1] - '0';
    for (int x = 0; x <= 9; x++) {
      ant[i][x] = ant[i - 1][x];
    }
    ant[i][c[i]] = i;
  }
  for (int x = 0; x <= 9; x++) {
    nxt[n + 1][x] = n + 1;
  }
  for (int i = n; i >= 1; i--) {
    for (int x = 0; x <= 9; x++) {
      nxt[i][x] = nxt[i + 1][x];
    }
    nxt[i][c[i]] = i;
  }
  for (int l = n; l >= 1; l--) {
    dp[l][l] = 1;
    for (int r = l + 1; r <= n; r++) {
      if (c[l] == c[r]) {
        dp[l][r] = dp[l + 1][r - 1] + 2;
      } else {
        dp[l][r] = max(dp[l + 1][r], dp[l][r - 1]);
      }
    }
  }
  int be = 0;
  for (int x = 1; x <= 9; x++) {
    int l = nxt[1][x];
    int r = ant[n][x];
    if (l > r) {
      continue;
    }
    be = max(be, dp[l][r]);
  }
  for (int x = 9; x >= 1; x--) {
    int l = nxt[1][x];
    int r = ant[n][x];
    if (l > r) {
      continue;
    }
    if (dp[l][r] == be) {
      print(l, r);
      return 0;
    }
  }
  return 0;
}