Cod sursa(job #2558105)

Utilizator PetyAlexandru Peticaru Pety Data 26 februarie 2020 12:05:35
Problema Seif Scor 50
Compilator cpp-64 Status done
Runda sim11_1 Marime 1.56 kb
#include <bits/stdc++.h>
#define x first
#define y second

using namespace std;

ifstream fin ("seif.in");
ofstream fout ("seif.out");

int t, n, m, k, dp[1002][1002], nexta[1002][26], nextb[1002][26];
string a, b;

int main()
{
  fin >> t;
  while (t--) {
    fin >> k >> a >> b;
    n = a.size();
    m = b.size();
    a = '#' + a;
    b = '#' + b;
    memset(dp, 0, sizeof(dp));
    memset(nexta, 0, sizeof(nexta));
    memset(nextb, 0, sizeof(nextb));
    for (int i = n; i >= 1; i--)
      for (int j = m; j >= 1; j--) {
        if (a[i] == b[j])
          dp[i][j] = dp[i + 1][j + 1] + 1;
        dp[i][j] = max(dp[i][j], dp[i][j + 1]);
        dp[i][j] = max(dp[i][j], dp[i + 1][j]);
      }
    for (int i = n; i >= 1; i--) {
      for (int j = 0; j < 26; j++) {
        if (a[i] - 'A' == j)
          nexta[i][j] = i;
        else
          nexta[i][j] = nexta[i + 1][j];
      }
    }
    for (int i = m; i >= 1; i--)
      for (int j = 0; j < 26; j++)
        if (b[i] - 'A' == j)
          nextb[i][j] = i;
        else
          nextb[i][j] = nextb[i + 1][j];
    int i = 1, j = 1;
    while (1) {
      bool ok = 0;
      for (int l = 25; l >= 0; l--) {
        if (nexta[i][l] != 0 && nextb[j][l] != 0 && dp[nexta[i][l]][nextb[j][l]] >= k && dp[nexta[i][l]][nextb[j][l]] > 0) {
          k--;
          fout << (char)(l + 'A');
          i = nexta[i][l] + 1;
          j = nextb[j][l] + 1;
          ok = 1;
          break;
        }
      }
      if (!ok)
        break;
    }
    fout << "\n";
  }
  return 0;
}