QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#877030#850. Edit Distance Yet AgainningagoAC ✓1906ms57192kbC++145.8kb2025-01-31 18:28:422025-01-31 18:28:55

Judging History

This is the latest submission verdict.

  • [2025-01-31 18:28:55]
  • Judged
  • Verdict: AC
  • Time: 1906ms
  • Memory: 57192kb
  • [2025-01-31 18:28:42]
  • Submitted

answer

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <numeric>
#include <vector>
#include <queue>
#include <map>
#include <cmath>
#include <cctype>
#include <set>

namespace uvu
{
#define LOCAL ____________DONT_DEFINE_ME____________
#define ll long long
#define inf 0x3f3f3f3f
// #define int long long
// #define inf 0x3f3f3f3f3f3f3f3fll
#define infll 0x3f3f3f3f3f3f3f3fll
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define gline debug("now is #%d\n", __LINE__)
#define pii std::pair <int, int>
#define mkp std::make_pair
#define fi first
#define se second
char _ST_;
const int BUFSIZE = (1 << 20);
char ibuf[BUFSIZE], *iS = ibuf, *iT = ibuf;
char obuf[BUFSIZE], *oS = obuf, *oT = obuf + BUFSIZE;
char getc()
{
#ifdef LOCAL
	return getchar();
#else
	if(iS == iT) iT = (iS = ibuf) + fread(ibuf, 1, BUFSIZE, stdin);
	return iS == iT ? EOF : *iS++;
#endif
#define getchar ERR
}

void Flush() { fwrite(obuf, 1, oS - obuf, stdout); oS = obuf; }
struct Flusher { ~Flusher(){ Flush(); } }iamflusher;

void putc(char c)
{
#ifdef LOCAL
	putchar(c);
#else
	*oS++ = c;
	if(oS == oT) Flush();
#endif
#define putchar ERR
}

template <typename T = int> T read()
{
	T x = 0, f = 1; char c = getc();
	for(; !isdigit(c); c = getc()) if(c == '-') f = -1;
	for(;  isdigit(c); c = getc()) x = (x << 3) + (x << 1) + (c ^ 48);
	return x * f;
}

template <typename T> void print(T x, char c)
{
static int sta[BUFSIZE], top;
	top = 0;
	if(x < 0) putc('-'), x = -x;
	if(!x) sta[top = 1] = 0;
	for(; x; x /= 10) sta[++top] = x % 10;
	for(; top; ) putc(sta[top--] ^ 48);
	if(c) putc(c);
}

int readstr(char *s, int base)
{
	int idx = base - 1; char c = getc();
	for(; !(isdigit(c) || isalpha(c) || c == '#' || c == '.'); c = getc());
	for(;   isdigit(c) || isalpha(c) || c == '#' || c == '.' ; c = getc()) s[++idx] = c;
	return idx - base + 1;
}

void printf(const char *s) { for(; *s; s++) putc(*s); }
template <typename T, typename ... Args>
void printf(const char *s, T x, Args ... rest)
{
	for(; *s; s++)
	{
		if(*s != '%') { putc(*s); continue; }
		s++; if(*s == 'd') print(x, 0);
		else if(*s == 'c') putc(x);
		printf(s + 1, rest ...);
		return;
	}
}

template <typename T> void ckmax(T &x, T y) { x = x > y ? x : y; }
template <typename T> void ckmin(T &x, T y) { x = x < y ? x : y; }
// #define mod 998244353
// #define mod 1000000007
// int sm(int x) { return x >= mod ? x - mod : x; }
// void plus_(int &x, int y) { x = sm(x + y); }
// void mul_(int &x, int y) { x = 1ll * x * y % mod; }
// int ksm(int a, int b) { int res = 1; for(; b; b >>= 1, mul_(a, a)) if(b & 1) mul_(res, a); return res; }

#define N 1000010
#define M 1010
const int base1 = 121;
const int base2 = 131;
const int mod1 = 998244853;
const int mod2 = 1000000009;
int base1pow[N], base2pow[N];
struct hs
{
	int v1, v2;
	bool operator == (hs B) { return v1 == B.v1 && v2 == B.v2; }
	hs up(int x) { return (hs){(int)(1ll * v1 * base1pow[x] % mod1), (int)(1ll * v2 * base2pow[x] % mod2)}; }
	hs operator + (int x) { return (hs){(v1 + x) % mod1, (v2 + x) % mod2}; }
	hs operator - (hs B) { return (hs){(v1 + mod1 - B.v1) % mod1, (v2 + mod2 - B.v2) % mod2}; }
}pres[N], pret[N];
hs hashs(int l, int r) { return pres[r] - pres[l - 1].up(r - l + 1); }
hs hasht(int l, int r) { return pret[r] - pret[l - 1].up(r - l + 1); }

int n, m, K;
char s[N], t[N];
int lcp(int x, int y) 
{
	int res = 0;
	for(int l = 1, r = std::min(n - x + 1, m - y + 1), mid; l <= r; )
	{
		mid = (l + r) >> 1;
		if(hashs(x, x + mid - 1) == hasht(y, y + mid - 1)) res = mid, l = mid + 1; 
		else r = mid - 1;
	}
	return res;
}
const int DT = 1000;
int dp[M][M << 1], lst[M][M << 1], val[M][M << 1];

void solve()
{
	// memset(h, idx = -1, sizeof(h));
	n = read(), m = read(), K = read();
	readstr(s, 1); readstr(t, 1);
	for(int i = 1; i <= n; i++) pres[i] = pres[i - 1].up(1) + (s[i] - 'a' + 1);
	for(int i = 1; i <= m; i++) pret[i] = pret[i - 1].up(1) + (t[i] - 'a' + 1);
	// memset(dp, -1, sizeof(dp));
	for(int i = 0; i <= K; i++) for(int j = -K; j <= K; j++) dp[i][j + DT] = -1;
	dp[0][DT] = 0;
	for(int i = 0; i <= K; i++)
	{
		for(int j = -K; j <= K; j++) if(~dp[i][j + DT]) // x - y = j
		{
			dp[i][j + DT] += lcp(dp[i][j + DT] + 1, dp[i][j + DT] + 1 - j);
			if(i == K) continue;
			auto upd = [&](int y, int z, int o) -> void { if(y < -K || y > K) return; if(z >= dp[i + 1][y + DT]) dp[i + 1][y + DT] = z, lst[i + 1][y + DT] = j, val[i + 1][y + DT] = o; };
			if(dp[i][j + DT] != n) upd(j + 1, dp[i][j + DT] + 1, 0);
			if(dp[i][j + DT] - j != m) upd(j - 1, dp[i][j + DT], 1);
			if(dp[i][j + DT] != n && dp[i][j + DT] - j != m) upd(j, dp[i][j + DT] + 1, 2);
		}
	}
	if(abs(n - m) > K) { printf("NO\n"); return; }
	// for(int _ = 0; _ <= K; _++) printf("dp[%d][%d] = %d\n", _, n - m, dp[_][n - m + DT]);
	for(int _ = 0; _ <= K; _++)	if(dp[_][n - m + DT] == n)
	{
		printf("YES\n%d\n", _);
		int i = _, j = n - m;
		while(i)
		{
			int k = lst[i][j + DT];
			// printf("dp[%d][%d] = %d, dp[%d][%d] = %d\n", i, j, dp[i][j + DT], i - 1, k, dp[i - 1][k + DT]);
			if(val[i][j + DT] == 0) printf("DELETE %d\n", dp[i - 1][k + DT] + 1);
			if(val[i][j + DT] == 1) printf("INSERT %d %c\n", dp[i - 1][k + DT] + 1, t[dp[i - 1][k + DT] - k + 1]);
			if(val[i][j + DT] == 2) printf("REPLACE %d %c\n", dp[i - 1][k + DT] + 1, t[dp[i - 1][k + DT] - k + 1]);
			i--, j = k;
		}
		return;
	}
	printf("NO\n");
}

void init()
{
	base1pow[0] = base2pow[0] = 1;
	for(int i = 1; i < N; i++)
	{
		base1pow[i] = 1ll * base1pow[i - 1] * base1 % mod1;
		base2pow[i] = 1ll * base2pow[i - 1] * base2 % mod2;
	}
}

char _ED_;

void mian()
{
	debug("%.3f MB\n", abs(&_ST_ - &_ED_) / 1024.0 / 1024);
	init();
	for(int T = read(); T; solve(), T--);
}

#ifdef int
	#undef int
#endif
}

int main()
{
	uvu::mian(); return 0;
}

详细

Test #1:

score: 100
Accepted
time: 5ms
memory: 24356kb

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: 0
Accepted
time: 7ms
memory: 24780kb

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
DELETE 33
DELETE 32
DELETE 31
DELETE 30
REPLACE 27 p
REP...

result:

ok OK!

Test #3:

score: 0
Accepted
time: 1739ms
memory: 41756kb

input:

100
3211 3185 685
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww...

output:

YES
552
REPLACE 3211 f
DELETE 3210
DELETE 3209
DELETE 3208
DELETE 3207
DELETE 3206
DELETE 3205
DELETE 3204
DELETE 3203
DELETE 3202
DELETE 3201
DELETE 3200
DELETE 3199
DELETE 3198
DELETE 3197
DELETE 3196
DELETE 3195
DELETE 3194
DELETE 3193
DELETE 3192
DELETE 3191
DELETE 3190
DELETE 3189
DELETE 3188
D...

result:

ok OK!

Test #4:

score: 0
Accepted
time: 1666ms
memory: 55548kb

input:

5
999000 998976 995
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll...

output:

YES
894
DELETE 999000
DELETE 998999
DELETE 998998
DELETE 998997
DELETE 998996
DELETE 998995
DELETE 998994
DELETE 998993
DELETE 998992
DELETE 998991
DELETE 998990
DELETE 998989
DELETE 998988
DELETE 998987
DELETE 998986
DELETE 998985
DELETE 998984
DELETE 998983
DELETE 998982
DELETE 998981
DELETE 99898...

result:

ok OK!

Test #5:

score: 0
Accepted
time: 1784ms
memory: 53264kb

input:

5
999000 998971 1000
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll...

output:

NO
NO
NO
NO
NO

result:

ok OK!

Test #6:

score: 0
Accepted
time: 878ms
memory: 55324kb

input:

5
1000000 1000000 1000
faafaffaaffafaafaffafaaffaafaffaaffafaaffaafaffafaafaffaaffafaafaffafaaffaafaffafaafaffaaffafaaffaafaffaaffafaafaffafaaffaafaffaaffafaaffaafaffafaafaffaaffafaaffaafaffaaffafaafaffafaaffaafaffafaafaffaaffafaafaffafaaffaafaffaaffafaaffaafaffafaafaffaaffafaafaffafaaffaafaffafaafa...

output:

YES
246
DELETE 2049
REPLACE 2046 a
DELETE 2043
DELETE 2039
DELETE 2037
DELETE 2031
DELETE 2029
DELETE 2027
DELETE 2025
DELETE 2015
DELETE 2013
DELETE 2011
DELETE 2009
DELETE 2007
DELETE 2005
DELETE 2003
DELETE 2001
DELETE 1953
REPLACE 1950 a
DELETE 1947
INSERT 1942 f
REPLACE 1938 a
INSERT 1937 f
DEL...

result:

ok OK!

Test #7:

score: 0
Accepted
time: 1906ms
memory: 57192kb

input:

5
999900 999925 992
ejqwvowvntrtmokrfeqeybcvgsupftozhkdsyytrioxrzbahikexefgyhpwbcztcydqiibxukojvgedldgmjufkzwttpvftctkpajgpwiklfzrkjxzsltqdbfdyxqpswrrlkdbmwckbhbfpqqgnhcixcnmphjulyykqfvdrqsdskbxqlqvekhwmvzmtqannmxrjgqcpdpofmqozyicaiqjikqxkeolandjydgvtjhnzubpdtkxymaxffnopnnrpnedobnfljcvtqwmuxdctutidm...

output:

YES
938
INSERT 999192 g
DELETE 999157
REPLACE 998754 g
INSERT 998259 b
INSERT 998188 g
DELETE 998145
REPLACE 997378 t
DELETE 997088
INSERT 994695 t
REPLACE 993971 b
DELETE 990472
REPLACE 988552 t
DELETE 987640
DELETE 985945
DELETE 985429
DELETE 983806
INSERT 983299 t
REPLACE 981534 g
INSERT 978807 t...

result:

ok OK!