QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#432051#850. Edit Distance Yet AgainMade_in_CodeAC ✓842ms39456kbC++142.6kb2024-06-06 17:06:482024-06-06 17:06:48

Judging History

你现在查看的是最新测评结果

  • [2024-06-06 17:06:48]
  • 评测
  • 测评结果:AC
  • 用时:842ms
  • 内存:39456kb
  • [2024-06-06 17:06:48]
  • 提交

answer

#include <iostream>
#define LL long long

using namespace std;

const int kMaxN = 1e6 + 1, kMaxM = 1001;
const int kInf = 1e9, kBase = 15553, kMod = 715876003;
int o, n, m, k, f[kMaxM << 1][kMaxM];
LL hs[kMaxN], ht[kMaxN], pw[kMaxN];
string s, t;

void Max(int &x, int y) { x = max(x, y); }

int W() {
  for (int i = 0; i <= k; i++) {
    if (f[n - m + kMaxM][i] == m) {
      cout << "YES\n"
           << i << '\n';
      return i;
    }
  }
  cout << "NO\n";
  return 0;
}

int Print(int n, int m, int x) {
  if (x <= 0) {
    return n + 1;
  } else if (f[n - m + 1 + kMaxM][x - 1] >= m - 1) {
    int w = Print(n, m - 1, x - 1);
    cout << "INSERT " << w << ' ' << t[m] << '\n';
    return w + 1;
  } else if (f[n - m - 1 + kMaxM][x - 1] >= m) {
    int w = Print(n - 1, m, x - 1);
    cout << "DELETE " << w << '\n';
    return w;
  } else if (s[n] != t[m]) {
    int w = Print(n - 1, m - 1, x - 1);
    cout << "REPLACE " << w << ' ' << t[m] << '\n';
    return w + 1;
  }
  return Print(n - 1, m - 1, x) + 1;
}

int main() {
  cin.tie(0), cout.tie(0);
  ios::sync_with_stdio(0);
  pw[0] = 1;
  for (int i = 1; i < kMaxN; i++) {
    pw[i] = pw[i - 1] * kBase % kMod;
  }
  cin >> o;
  while (o--) {
    cin >> n >> m >> k >> s >> t;
    if (abs(n - m) > k) {
      cout << "NO\n";
      continue;
    }
    s = '~' + s, t = '~' + t;
    for (int i = 1; i <= n; i++) {
      hs[i] = (hs[i - 1] * kBase + s[i]) % kMod;
    }
    for (int i = 1; i <= m; i++) {
      ht[i] = (ht[i - 1] * kBase + t[i]) % kMod;
    }
    for (int i = max(-k, -m); i <= min(k, n); i++) {
      f[i + kMaxM][0] = min(-i, 0);
    }
    for (int &i = f[kMaxM][0]; i < n && i < m && s[i + 1] == t[i + 1]; i++) {
    }
    for (int x = 1; x <= k; x++) {
      for (int i = max(-k, -m); i <= min(k, n); i++) {
        int &p = f[i + kMaxM][x];
        p = f[i + kMaxM][x - 1] + 1;
        if (i > max(-k, -m)) {
          p = max(p, f[i - 1 + kMaxM][x - 1]);
        }
        if (i < min(k, n)) {
          p = max(p, f[i + 1 + kMaxM][x - 1] + 1);
        }
        if (p >= max(-i, 0)) {
          int l = p + 1, r = min(n - i, m);
          while (l <= r) {
            int mid = l + r >> 1;
            LL ws = hs[i + mid] - hs[i + p] * pw[mid - p] % kMod + kMod;
            LL wt = ht[mid] - ht[p] * pw[mid - p] % kMod + kMod;
            ws >= kMod && (ws -= kMod), wt >= kMod && (wt -= kMod);
            ws == wt ? l = mid + 1 : r = mid - 1;
          }
          p = r;
        } else {
          p = min(p, min(n - i, m));
        }
      }
    }
    Print(n, m, W());
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 7ms
memory: 14872kb

input:

2
3 4 3
kot
plot
5 7 3
zycie
porazka

output:

YES
2
REPLACE 1 p
INSERT 2 l
NO

result:

ok OK!

Test #2:

score: 0
Accepted
time: 6ms
memory: 15424kb

input:

100
100 100 0
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
16 7 100
vvvvvvvvvvvvvvvv
qydopaq
37 33 43
ggggggggggggggggggggggggggggggggggggg
osk...

output:

YES
0
YES
16
REPLACE 1 q
REPLACE 2 y
REPLACE 3 d
REPLACE 4 o
REPLACE 5 p
REPLACE 6 a
REPLACE 7 q
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
DELETE 8
YES
28
REPLACE 1 o
REPLACE 2 s
REPLACE 3 k
REPLACE 5 m
REPLACE 6 l
REPLACE 8 j
REPLACE 9 t
REPLACE 10 u
REPLACE 11 a
REPLA...

result:

ok OK!

Test #3:

score: 0
Accepted
time: 657ms
memory: 22836kb

input:

100
3211 3185 685
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww...

output:

YES
552
REPLACE 4 i
REPLACE 16 b
REPLACE 17 s
REPLACE 20 u
REPLACE 29 j
REPLACE 31 b
REPLACE 33 z
REPLACE 39 l
REPLACE 67 l
REPLACE 68 s
REPLACE 70 i
REPLACE 73 p
REPLACE 91 g
REPLACE 101 x
REPLACE 111 y
REPLACE 113 x
REPLACE 115 s
REPLACE 117 f
REPLACE 121 m
REPLACE 123 a
REPLACE 130 h
REPLACE 132 ...

result:

ok OK!

Test #4:

score: 0
Accepted
time: 720ms
memory: 39456kb

input:

5
999000 998976 995
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll...

output:

YES
894
REPLACE 1682 u
REPLACE 2752 y
REPLACE 2983 z
REPLACE 4433 b
REPLACE 7318 m
REPLACE 8237 b
REPLACE 8898 n
REPLACE 9049 m
REPLACE 9504 n
REPLACE 9903 n
REPLACE 13572 q
REPLACE 14221 v
REPLACE 14615 y
REPLACE 16903 j
REPLACE 17197 e
REPLACE 18073 v
REPLACE 19408 b
REPLACE 20512 p
REPLACE 21033 ...

result:

ok OK!

Test #5:

score: 0
Accepted
time: 714ms
memory: 38292kb

input:

5
999000 998971 1000
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll...

output:

NO
NO
NO
NO
NO

result:

ok OK!

Test #6:

score: 0
Accepted
time: 258ms
memory: 39408kb

input:

5
1000000 1000000 1000
faafaffaaffafaafaffafaaffaafaffaaffafaaffaafaffafaafaffaaffafaafaffafaaffaafaffafaafaffaaffafaaffaafaffaaffafaafaffafaaffaafaffaaffafaaffaafaffafaafaffaaffafaaffaafaffaaffafaafaffafaaffaafaffafaafaffaaffafaafaffafaaffaafaffaaffafaaffaafaffafaafaffaaffafaafaffafaaffaafaffafaafa...

output:

YES
246
INSERT 1 a
REPLACE 3 f
INSERT 7 a
INSERT 13 a
INSERT 15 f
INSERT 25 a
INSERT 27 f
INSERT 29 f
INSERT 31 a
INSERT 49 a
INSERT 51 f
INSERT 53 f
INSERT 55 a
INSERT 57 f
INSERT 59 a
INSERT 61 a
INSERT 63 f
INSERT 97 a
REPLACE 99 f
INSERT 103 a
DELETE 109
REPLACE 111 f
DELETE 114
INSERT 129 f
REP...

result:

ok OK!

Test #7:

score: 0
Accepted
time: 842ms
memory: 38320kb

input:

5
999900 999925 992
ejqwvowvntrtmokrfeqeybcvgsupftozhkdsyytrioxrzbahikexefgyhpwbcztcydqiibxukojvgedldgmjufkzwttpvftctkpajgpwiklfzrkjxzsltqdbfdyxqpswrrlkdbmwckbhbfpqqgnhcixcnmphjulyykqfvdrqsdskbxqlqvekhwmvzmtqannmxrjgqcpdpofmqozyicaiqjikqxkeolandjydgvtjhnzubpdtkxymaxffnopnnrpnedobnfljcvtqwmuxdctutidm...

output:

YES
938
DELETE 1984
DELETE 2243
INSERT 4441 b
DELETE 5841
DELETE 6398
INSERT 6785 b
REPLACE 6948 t
INSERT 6988 g
REPLACE 7101 b
INSERT 7373 b
DELETE 10782
INSERT 12028 g
REPLACE 13721 g
INSERT 14908 t
DELETE 14925
INSERT 15582 b
REPLACE 17831 b
INSERT 19811 b
DELETE 22361
REPLACE 22445 t
INSERT 2508...

result:

ok OK!