Cod sursa(job #2589193)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 25 martie 2020 21:38:45
Problema Seif Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>
using namespace std;

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

int main() {
    int t; fin >> t;
    while (t--) {
        int k; fin >> k;
        string a; fin >> a; int m = a.size(); a = '*' + a;
        string b; fin >> b; int n = b.size(); b = '*' + b;

        vector<vector<int>> dp(m + 2, vector<int>(n + 2));
        for (int i = m; i >= 1; i--)
            for (int j = n; j >= 1; j--)
                if (a[i] == b[j])
                    dp[i][j] = dp[i + 1][j + 1] + 1;
                else
                    dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);

        vector<vector<int>> nextA(m + 1, vector<int>(26, m + 1));
        for (int i = m - 1; i >= 0; i--) {
            for (int x = 0; x < 26; x++)
                nextA[i][x] = nextA[i + 1][x];
            nextA[i][a[i + 1] - 'A'] = i + 1;
        }
        vector<vector<int>> nextB(n + 1, vector<int>(26, n + 1));
        for (int j = n - 1; j >= 0; j--) {
            for (int x = 0; x < 26; x++)
                nextB[j][x] = nextB[j + 1][x];
            nextB[j][b[j + 1] - 'A'] = j + 1;
        }

        for (int i = 0, j = 0; k >= 0; k--) {
            bool ok = false;
            for (int x = 25; x >= 0; x--)
                if (nextA[i][x] <= m && nextB[j][x] <= n && dp[nextA[i][x]][nextB[j][x]] >= k) {
                    i = nextA[i][x];
                    j = nextB[j][x];
                    k = dp[nextA[i][x]][nextB[j][x]];
                    fout << (char) (x + 'A');
                    ok = true;
                    break;
                }
            if (!ok) {
                fout << -1;
                break;
            }
        }
        fout << '\n';
    }

    fout.close();
    return 0;
}