Submission #64264862


Source Code Expand

// #pragma GCC target("avx2")
#pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
// #include<sys/time.h>
// #include<atcoder/convolution>
// #include<atcoder/modint>


using namespace std;

using P = pair<int, int>;
const int M = 1000000007;
const long long LM = 1LL << 60;


int n, m;
string s, t;
vector<vector<int>> lcslen;
vector<vector<int>> _lcscnt;
vector<vector<int>> nexts, nextt;
// int nexs[26][SIZE], next[26][SIZE];


int lcscnt(int si, int ti) {
    if (lcslen[si][ti] == 0) {
        return 1;
    }
    if (_lcscnt[si][ti] != -1) {
        return _lcscnt[si][ti];
    }
    int res = 0;
    for (int i = 0; i < 26; ++i) {
        int nsi = nexts[i][si] + 1;
        int nti = nextt[i][ti] + 1;
        if (nsi <= n && nti <= m && lcslen[nsi][nti] == lcslen[si][ti] - 1) {
            res += lcscnt(nsi, nti);
            res = min(res, M);
        }
    }
    return _lcscnt[si][ti] = res;
}

void dfs(int si, int ti, int rem, string& ans) {
    if (lcslen[si][ti] == 0) {
        assert(rem == 1);
        return;
    }
    for (int i = 0; i < 26; ++i) {
        int nsi = nexts[i][si] + 1;
        int nti = nextt[i][ti] + 1;
        if (nsi <= n && nti <= m && lcslen[nsi][nti] == lcslen[si][ti] - 1) {
            int c = lcscnt(nsi, nti);
            if (rem > c) {
                rem -= c;
            }
            else {
                ans.push_back((char)('a' + i));
                dfs(nsi, nti, rem, ans);
                return;
            }
        }
    }
    assert(false);
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    int q;
    cin >> n >> m >> s >> t >> q;

    _lcscnt = vector<vector<int>>(n + 1, vector<int>(m + 1, -1));
    lcslen = vector<vector<int>>(n + 1, vector<int>(m + 1));
    nexts = vector<vector<int>>(26, vector<int>(n + 1));
    nextt = vector<vector<int>>(26, vector<int>(m + 1));

    for (int i = 0; i < 26; ++i) {
        nexts[i][n] = n;
        for (int j = n - 1; j >= 0; --j) {
            if (s[j] == 'a' + i)  {
                nexts[i][j] = j;
            }
            else {
                nexts[i][j] = nexts[i][j + 1];
            }
        }
        nextt[i][m] = m;
        for (int j = m - 1; j >= 0; --j) {
            if (t[j] == 'a' + i)  {
                nextt[i][j] = j;
            }
            else {
                nextt[i][j] = nextt[i][j + 1];
            }
        }
    }
    for (int i = n; i >= 0; --i) {
        for (int j = m; j >= 0; --j) {
            if (i < n) {
                lcslen[i][j] = max(lcslen[i][j], lcslen[i + 1][j]);
            }
            if (j < m) {
                lcslen[i][j] = max(lcslen[i][j], lcslen[i][j + 1]);
            }
            if (i < n && j < m) {
                lcslen[i][j] = max(lcslen[i][j], lcslen[i + 1][j + 1] + (s[i] == t[j]));
            }
        }
    }
    int alllcs = lcscnt(0, 0);
    bool zero = true;
    for (int i = 0; i < 26; ++i) {
        if (nexts[i][0] < n && nextt[i][0] < m) {
            zero = false;
        }
    }
    if (zero) {
        alllcs = 0;
    }

    for (int _ = 0; _ < q; ++_) {
        int k;
        cin >> k;
        if (alllcs < k) {
            cout << -1 << '\n';
        }
        else {
            string ans = "";
            dfs(0, 0, k, ans);
            cout << ans << '\n';
        }
    }
    return 0;
}


Submission Info

Submission Time
Task H - LCS order
User riantkb
Language C++ 20 (gcc 12.2)
Score 100
Code Size 3361 Byte
Status AC
Exec Time 45 ms
Memory 11816 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 3
AC × 31
Set Name Test Cases
Sample sample_01, sample_02, sample_03
All largest_01, largest_02, longest_01, random_00, random_01, random_02, random_03, random_04, random_MAXNQ_00, random_MAXNQ_01, random_MAXNQ_02, random_MAXNQ_03, random_MAXNQ_04, random_MAXNQ_05, random_mini_00, random_mini_01, random_mini_02, random_mini_03, random_mini_04, random_mini_05, repeat_00, repeat_01, repeat_02, repeat_03, repeat_04, rotate_00, rotate_01, rotate_02, sample_01, sample_02, sample_03
Case Name Status Exec Time Memory
largest_01 AC 20 ms 11696 KiB
largest_02 AC 24 ms 11632 KiB
longest_01 AC 45 ms 11816 KiB
random_00 AC 2 ms 4028 KiB
random_01 AC 2 ms 3708 KiB
random_02 AC 13 ms 8556 KiB
random_03 AC 2 ms 4672 KiB
random_04 AC 1 ms 3516 KiB
random_MAXNQ_00 AC 18 ms 11528 KiB
random_MAXNQ_01 AC 18 ms 11608 KiB
random_MAXNQ_02 AC 19 ms 11508 KiB
random_MAXNQ_03 AC 19 ms 11752 KiB
random_MAXNQ_04 AC 19 ms 11584 KiB
random_MAXNQ_05 AC 18 ms 11756 KiB
random_mini_00 AC 2 ms 3332 KiB
random_mini_01 AC 1 ms 3500 KiB
random_mini_02 AC 1 ms 3432 KiB
random_mini_03 AC 1 ms 3432 KiB
random_mini_04 AC 1 ms 3436 KiB
random_mini_05 AC 1 ms 3448 KiB
repeat_00 AC 2 ms 4276 KiB
repeat_01 AC 4 ms 5216 KiB
repeat_02 AC 2 ms 3968 KiB
repeat_03 AC 1 ms 3636 KiB
repeat_04 AC 2 ms 4400 KiB
rotate_00 AC 6 ms 8476 KiB
rotate_01 AC 1 ms 3660 KiB
rotate_02 AC 4 ms 6632 KiB
sample_01 AC 1 ms 3452 KiB
sample_02 AC 1 ms 3332 KiB
sample_03 AC 1 ms 3480 KiB