QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#746252#5312. Levenshtein DistancechroneZWA 1260ms11856kbC++173.3kb2024-11-14 14:00:002024-11-14 14:00:00

Judging History

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

  • [2024-11-14 14:00:00]
  • 评测
  • 测评结果:WA
  • 用时:1260ms
  • 内存:11856kb
  • [2024-11-14 14:00:00]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
inline void cmin(int &x, int y) {if(x > y) x = y;}
inline void cmax(int &x, int y) {if(x < y) x = y;}

constexpr int N = 1e5 + 5;
int K, n, m;
char a[N], b[N];

constexpr int mod[2] = {998244353, 1004535809};
constexpr int base[2] = {31, 29};
int Pow[2][N];
inline pair<int, int> add(pair<int, int> H, char ch) {
  int x = H.first, y = H.second;
  x = (1ll * x * base[0] + (ch - 'a' + 1)) % mod[0];
  y = (1ll * y * base[1] + (ch - 'a' + 1)) % mod[1];
  return {x, y};
}
struct Hash {
  char *s; int n;
  pair<int, int> w[N];
  inline void build() {
    for(int i = 1; i <= n; i++) {
      w[i] = add(w[i - 1], s[i]);
    }
  }
  inline pair<int, int> getH(int l, int r) {
    int x = w[r].first, y = w[r].second;
    x = (mod[0] + x - 1ll * w[l - 1].first * Pow[0][r - l + 1] % mod[0]) % mod[0];
    y = (mod[1] + y - 1ll * w[l - 1].second * Pow[1][r - l + 1] % mod[1]) % mod[1];
    return {x, y};
  }
} Ha, Hb;

unordered_map<int, int> rec[N];
inline int lcp(int x, int y) {
  // cerr << x << " " << y << "!\n";
  int t = 0;
  // // cerr << x << " " << y << " ";
  while(x <= n && y <= m && a[x] == b[y]) 
    t++, x++, y++;
  return t;
  if(x > n || y > m) return 0;
  if(rec[x].find(y) != rec[x].end()) return rec[x][y];
  int l = 1, r = min(n - x + 1, m - y + 1), res = 0;
  while(l <= r) {
    int mid = l + r >> 1;
    if(Ha.getH(x, x + mid - 1) == Hb.getH(y, y + mid - 1)) {
      l = mid + 1;
      res = mid;
    } else {
      r = mid - 1;
    }
  }
  return rec[x][y] = res;
}

constexpr int M = 35;
int f[M][M << 1], pos[N];
int ans[M];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);
  
  Pow[0][0] = Pow[1][0] = 1;
  for(int i = 1; i < N; i++) {
    for(int o = 0; o < 2; o++) {
      Pow[o][i] = 1ll * Pow[o][i - 1] * base[o] % mod[o];
    }
  }

  cin >> K;
  cin >> a + 1 >> b + 1;
  n = strlen(a + 1), m = strlen(b + 1);
  Ha.s = a, Ha.n = n, Hb.s = b, Hb.n = m;
  Ha.build(), Hb.build();

  for(int L = 1; L <= m; L++) {
    memset(f, -1, sizeof(f));
    f[0][0 + K] = 0;
    for(int i = 0; i <= K; i++) {
      for(int j = -K; j <= K; j++) {
        if(f[i][j + K] != -1) {
          f[i][j + K] += lcp(f[i][j + K] + 1, f[i][j + K] + 1 + j + L - 1);
          cmax(f[i + 1][j + 1 + K], f[i][j + K]);
          if(f[i][j + K] < n) {
            cmax(f[i + 1][j + K], f[i][j + K] + 1);
            cmax(f[i + 1][j - 1 + K], f[i][j + K] + 1);
          }
        }
        // cerr << i << ", " << j << ", " << f[i][j + K] << "\n";
        // cerr << f[i][j + K] << " \n"[j == K];
      }
    }
    for(int j = -K; j <= K; j++) {
      if(n + j + L - 1 > m) continue;
      pos[n + j + L - 1] = K + 1;
      for(int i = 0; i <= K; i++) {
        if(f[i][j + K] >= n) {
          pos[n + j + L - 1] = i;
          break;
        }
      }
    }
    int lo = max(L, n - K + L - 1), hi = min(m, n + K + L - 1);
    // for(int i = lo; i <= hi; i++) cerr << pos[i] << " \n"[i == hi];
    for(int i = hi - 1; i >= lo; i--) cmin(pos[i], pos[i + 1] + 1);
    for(int i = lo + 1; i <= hi; i++) cmin(pos[i], pos[i - 1] + 1);
    for(int i = lo; i <= hi; i++) {
      ans[pos[i]]++;
    }
  }
  for(int i = 0; i <= K; i++) {
    cout << ans[i] << "\n";
  }
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 11480kb

input:

4
aaa
aabbaab

output:

0
5
15
7
1

result:

ok 5 number(s): "0 5 15 7 1"

Test #2:

score: 0
Accepted
time: 1260ms
memory: 11620kb

input:

30
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

result:

ok 31 numbers

Test #3:

score: -100
Wrong Answer
time: 328ms
memory: 11856kb

input:

30
BBAAABAABBBA
ABBABBBBAABAAAABABBBAABAABBAABAAAAAABAABABBAAAABAAAAABABAABAABBABBAAAABBBBAABBABAAABAABAABBBBBABBABABBBBABBBBAAABBABABBBBAAABBBBAAAABABABABABABABAAABBBBBAABAABAABBAABBBAABBBBBBBABAABAABAABABAABAAABAABBBAABABBABBAAABAAAABABABBABBBAAABBBAAAABBBBABABABAABAABBBBBBBBBAABBBABABBBABAABBABBA...

output:

17
662
8230
50302
166666
310121
345469
280387
227200
209178
203013
198561
105117
102147
99771
97730
96058
94730
93633
92720
92060
91525
91174
90861
90614
90447
90315
90226
90145
90092
90058

result:

wrong answer 23rd numbers differ - expected: '91143', found: '91174'