Cod sursa(job #2634665)

Utilizator pregoliStana Andrei pregoli Data 11 iulie 2020 22:02:17
Problema Seif Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>
#define newline '\n'
using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
///***********************
const int NMAX = 1e3 + 5, SIGMA = 'z' - 'a' + 1;
int n, m, k;
char s1[NMAX], s2[NMAX];
int dp[NMAX][NMAX], nxt[2][NMAX][SIGMA];

inline int mapv(char c) {
    return c - 'A';
}

void reset() {
    memset(dp, 0, sizeof(dp));
    for (char c = 'A'; c <= 'Z'; c++)
        nxt[0][n + 1][mapv(c)] = nxt[1][m + 1][mapv(c)] = NMAX;
}

void precompute() {
    for (int i = n; i; i--)
        for (int j = m; j; j--)
            if (s1[i] == s2[j])
                dp[i][j] = dp[i + 1][j + 1] + 1;
            else
                dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
    for (int i = n; i; i--) {
        for (char c = 'A'; c <= 'Z'; c++)
            nxt[0][i][mapv(c)] = nxt[0][i + 1][mapv(c)];
        nxt[0][i][mapv(s1[i])] = i;
    }
    for (int j = m; j; j--) {
        for (char c = 'A'; c <= 'Z'; c++)
            nxt[1][j][mapv(c)] = nxt[1][j + 1][mapv(c)];
        nxt[1][j][mapv(s2[j])] = j;
    }
}

void solve() {
    char c;
    int i = 1, j = 1;
    while (i <= n && j <= m) {
        bool ok = false;
        for (c = 'Z';!ok && c >= 'A'; c--) {
            int p1 = nxt[0][i][mapv(c)];
            int p2 = nxt[1][j][mapv(c)];
            if (p1 <= n && p2 <= m && dp[p1][p2] >= k) {
                fout << s1[p1];
                i = p1 + 1;
                j = p2 + 1;
                ok = true;
                k--;
            }
        }
        if (c < 'A' && !ok)
            break;
    }
    fout << newline;
}

int main() {
    int q;
    for (fin >> q; q--;) {
        fin >> k >> (s1 + 1) >> (s2 + 1);
        n = strlen(s1 + 1);
        m = strlen(s2 + 1);
        reset();
        precompute();
        solve();
    }
    fout.close();
    return 0;
}