#include <bits/stdc++.h>
using namespace std;
template <class X, class Y>
bool cmax(X &a, const Y &b) {
return a < b ? a = b, 1 : 0;
}
const int N = 2005;
int dp[N][N * 2], dir[N][N * 2], m, n;
/// 0: up, 1: up-left, 2:left
void init_lcs(string s, string t) {
memset(dp, 0, sizeof dp);
memset(dir, 0, sizeof dp);
m = s.size(), n = t.size();
t += t; dir[0][1] = 2;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= 2 * n; j++) {
dp[i][j] = dp[i - 1][j];
if (s[i - 1] == t[j - 1] && cmax
(dp[i][j], dp[i - 1][j - 1] + 1))
dir[i][j] = 1;
if (cmax(dp[i][j], dp[i][j - 1]))
dir[i][j] = 2;
}
}
int get_lcs(int i, int j) {
int lcs = 0;
while (i) {
if (dir[i][j] == 2) j--;
else if (dir[i][j] == 1) {
i--; j--; lcs++;
}
else i--;
}
return lcs;
}
void remove_col(int j) {
int i = 0;
while (j < 2 * n) {
if (dir[i][j + 1] == 2)
dir[i][++j] = 0;
else {
if (i == m) break;
if (dir[++i][j + 1] == 1)
dir[i][++j] = 0;
}
}
}
int circular_lcs(string s, string t) {
init_lcs(s, t); int lcs = 0;
for (int j = 0; j < n; j++) {
cmax(lcs, get_lcs(m, j + n));
remove_col(j);
}
return lcs;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
string s, t; cin >> s >> t;
cout << circular_lcs(s, t) << '\n';
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
36 ms |
63212 KB |
Output isn't correct |
2 |
Correct |
36 ms |
63212 KB |
Output is correct |
3 |
Correct |
36 ms |
63212 KB |
Output is correct |
4 |
Correct |
41 ms |
63212 KB |
Output is correct |
5 |
Correct |
35 ms |
63212 KB |
Output is correct |
6 |
Incorrect |
40 ms |
63340 KB |
Output isn't correct |
7 |
Correct |
63 ms |
63340 KB |
Output is correct |
8 |
Incorrect |
68 ms |
63212 KB |
Output isn't correct |
9 |
Correct |
67 ms |
63212 KB |
Output is correct |
10 |
Correct |
62 ms |
63212 KB |
Output is correct |
11 |
Correct |
64 ms |
63340 KB |
Output is correct |
12 |
Incorrect |
55 ms |
63212 KB |
Output isn't correct |
13 |
Correct |
79 ms |
63212 KB |
Output is correct |
14 |
Correct |
68 ms |
63212 KB |
Output is correct |
15 |
Correct |
74 ms |
63212 KB |
Output is correct |
16 |
Correct |
74 ms |
63212 KB |
Output is correct |
17 |
Incorrect |
56 ms |
63468 KB |
Output isn't correct |
18 |
Correct |
74 ms |
63212 KB |
Output is correct |
19 |
Correct |
65 ms |
63352 KB |
Output is correct |
20 |
Incorrect |
90 ms |
63212 KB |
Output isn't correct |
21 |
Correct |
43 ms |
63340 KB |
Output is correct |
22 |
Correct |
45 ms |
63212 KB |
Output is correct |
23 |
Correct |
50 ms |
63212 KB |
Output is correct |
24 |
Incorrect |
51 ms |
63212 KB |
Output isn't correct |
25 |
Incorrect |
59 ms |
63212 KB |
Output isn't correct |