QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#877030 | #850. Edit Distance Yet Again | ningago | AC ✓ | 1906ms | 57192kb | C++14 | 5.8kb | 2025-01-31 18:28:42 | 2025-01-31 18:28:55 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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!