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 |
|
|
| 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 |