QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#876685#850. Edit Distance Yet AgainasdfsdfWA 563ms52964kbC++234.1kb2025-01-31 11:08:132025-01-31 11:08:13

Judging History

This is the latest submission verdict.

  • [2025-01-31 11:08:13]
  • Judged
  • Verdict: WA
  • Time: 563ms
  • Memory: 52964kb
  • [2025-01-31 11:08:13]
  • Submitted

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