QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#876685 | #850. Edit Distance Yet Again | asdfsdf | WA | 563ms | 52964kb | C++23 | 4.1kb | 2025-01-31 11:08:13 | 2025-01-31 11:08:13 |
Judging History
answer
#ifdef _MSC_VER
# include <intrin.h>
# define __builtin_popcount __popcnt
#endif
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,fma")
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef long double ld;
#define MAX 4020202
#define MAXS 21
#define INF 1e18
#define TC 1
#define ln '\n'
#define bb ' '
int sa[MAX];
int gr[MAX];
int ngr[MAX];
int cnt[MAX];
int imsi[MAX];
void Suffix_array(string s) {
int n = (int)s.size(), m = max(300ll, n + 1ll);
for (int i = 0; i < n; ++i) sa[i] = i, gr[i] = s[i];
for (int len = 1; len < n; len <<= 1) {
for (int i = 0; i < m; ++i) cnt[i] = 0;
for (int i = 0; i < n; ++i) ++cnt[gr[i + len]];
for (int i = 1; i < m; ++i) cnt[i] += cnt[i - 1];
for (int i = n - 1; i >= 0; --i) imsi[--cnt[gr[i + len]]] = i;
for (int i = 0; i < m; ++i) cnt[i] = 0;
for (int i = 0; i < n; ++i) ++cnt[gr[i]];
for (int i = 1; i < m; ++i) cnt[i] += cnt[i - 1];
for (int i = n - 1; i >= 0; --i) sa[--cnt[gr[imsi[i]]]] = imsi[i];
ngr[sa[0]] = 1;
for (int i = 1; i < n; ++i) ngr[sa[i]] = ngr[sa[i - 1]] + (gr[sa[i - 1]] < gr[sa[i]] || (gr[sa[i - 1]] == gr[sa[i]] && gr[sa[i - 1] + len] < gr[sa[i] + len]));
swap(gr, ngr);
if (gr[sa[n - 1]] == n) break;
}
}
int rk[MAX];
int lcp[MAX];
void Lcp(string s) {
int n = (int)s.size(); s += '^';
for (int i = 0; i < n; ++i) rk[sa[i]] = i;
for (int i = 0, j = 0; i < n; ++i) if (rk[i]) {
while (s[i + j] == s[sa[rk[i] - 1] + j]) ++j;
lcp[rk[i]] = (j ? j-- : 0);
}
}
int N, M, K;
int X;
int sp[MAX][MAXS];
inline int getnext(int a, int b) {
if (a == N || b == M) return 0;
int p, q;
p = rk[a];
q = rk[N + 1 + b];
if (p > q) swap(p, q);
int d = q - p;
int i;
int res = 1e9;
for (i = 0; i < MAXS; i++) if (d >> i & 1) {
res = min(res, sp[p][i]);
p += 1 << i;
}
return res;
}
int dp[1010][2020];
pii path[1010][2020];
void solve() {
cin >> N >> M >> K;
string s, t;
cin >> s >> t;
if (s == t) {
cout << "YES" << ln;
cout << 0 << ln;
return;
}
if (abs(N - M) > K) {
cout << "NO" << ln;
return;
}
string c = s + '#' + t;
Suffix_array(c);
Lcp(c);
X = c.size();
int i, j;
for (i = 0; i + 1 < X; i++) sp[i][0] = lcp[i + 1];
sp[X - 1][0] = 1e9;
for (j = 1; j < MAXS; j++) {
for (i = 0; i < X; i++) {
int n = i + (1 << (j - 1));
n = min(n, X - 1);
sp[i][j] = min(sp[i][j - 1], sp[n][j - 1]);
}
}
for (i = 0; i <= K; i++) for (j = -K - 5; j <= K + 5; j++) dp[i][j + K] = -1;
dp[0][K] = getnext(0, 0);
for (i = 0; i < K; i++) {
for (j = -K; j <= K; j++) {
if (!~dp[i][j + K]) continue;
int a, b;
a = dp[i][j + K];
b = a + j;
if (a == N && b == M) continue;
if (a == N) {
if (dp[i + 1][j + 1 + K] < a) {
dp[i + 1][j + 1 + K] = a;
path[i + 1][j + 1 + K] = pii(j, 2);
}
continue;
}
if (b == M) {
if (dp[i + 1][j - 1 + K] < a) {
dp[i + 1][j - 1 + K] = a;
path[i + 1][j - 1 + K] = pii(j, 1);
}
continue;
}
int na, nb;
for (int k = 1; k < 4; k++) {
na = a + (k & 1);
nb = b + (k >> 1);
int d = getnext(na, nb);
na += d;
nb += d;
if (dp[i + 1][nb - na + K] < na) {
dp[i + 1][nb - na + K] = na;
path[i + 1][nb - na + K] = pii(j, k);
}
}
}
}
int d = M - N;
int ans = 0;
for (i = 1; i <= K; i++) {
if (dp[i][d + K] == N) {
ans = i;
break;
}
}
if (!ans) {
cout << "NO" << ln;
return;
}
cout << "YES" << ln;
cout << ans << ln;
int a, b;
a = N;
b = M;
for (i = ans; i >= 1; i--) {
pii p = path[i][b - a + K];
int na, nb;
na = dp[i - 1][p.first + K];
nb = na + p.first;
if (p.second == 1) cout << "DELETE" << bb << na + 1 << ln;
if (p.second == 2) cout << "INSERT" << bb << na + 1 << bb << t[nb] << ln;
if (p.second == 3) cout << "REPLACE" << bb << na + 1 << bb << t[nb] << ln;
a = na;
b = nb;
}
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T--) solve();
}
詳細信息
Test #1:
score: 100
Accepted
time: 7ms
memory: 50780kb
input:
2 3 4 3 kot plot 5 7 3 zycie porazka
output:
YES 2 INSERT 2 l REPLACE 1 p NO
result:
ok OK!
Test #2:
score: -100
Wrong Answer
time: 563ms
memory: 52964kb
input:
100 100 100 0 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 16 7 100 vvvvvvvvvvvvvvvv qydopaq 37 33 43 ggggggggggggggggggggggggggggggggggggg osk...
output:
YES 0 YES 16 REPLACE 16 q REPLACE 15 a REPLACE 14 p REPLACE 13 o REPLACE 12 d REPLACE 11 y REPLACE 10 q DELETE 9 DELETE 8 DELETE 7 DELETE 6 DELETE 5 DELETE 4 DELETE 3 DELETE 2 DELETE 1 YES 28 REPLACE 37 o REPLACE 36 o REPLACE 35 a REPLACE 34 a REPLACE 31 p REPLACE 29 k REPLACE 28 c REPLACE 27 o REPL...
result:
wrong answer At test 7 expected 6 got 7