QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#390384#5312. Levenshtein Distance251SecWA 458ms15460kbC++142.5kb2024-04-15 14:40:032024-04-15 14:40:04

Judging History

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

  • [2024-04-15 14:40:04]
  • 评测
  • 测评结果:WA
  • 用时:458ms
  • 内存:15460kb
  • [2024-04-15 14:40:03]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int f[35][65];
int n, m, k;
char s[100005], t[100005], st[200005];
int sa[200005], rk[200005], rko[200005], sao[200005], bu[200005], h[200005][20];
int ans[35];
void BuildSA() {
	int l = n + m + 1, m = 255;
	for (int i = 1; i <= l; i++) bu[rk[i] = st[i]]++;
	for (int i = 1; i <= m; i++) bu[i] += bu[i - 1];
	for (int i = l; i; i--) sa[bu[rk[i]]--] = i;
	for (int w = 1; w < l; w <<= 1) {
		int p = 0;
		for (int i = l; i > l - w; i--) sao[++p] = i;
		for (int i = 1; i <= l; i++) if (sa[i] > w) sao[++p] = sa[i] - w;
		memset(bu, 0, sizeof(bu));
		for (int i = 1; i <= l; i++) bu[rk[i]]++;
		for (int i = 1; i <= m; i++) bu[i] += bu[i - 1];
		for (int i = l; i; i--) sa[bu[rk[sao[i]]]--] = sao[i];
		memcpy(rko, rk, sizeof(rk));
		p = 0;
		for (int i = 1; i <= l; i++) rk[sa[i]] = (p += rko[sa[i]] != rko[sa[i - 1]] || rko[sa[i] + w] != rko[sa[i - 1] + w]);
		m = p;
	}
	for (int i = 1, k = 0; i <= l; i++) {
        if (rk[i] == 1) { k = h[1][0] = 0; continue; }
        if (k) k--;
        while (st[i + k] == st[sa[rk[i] - 1] + k]) k++;
        h[rk[i]][0] = k;
    }
	for (int j = 1; j < 20; j++) {
		for (int i = 1; i + (1 << j) - 1 <= l; i++) {
			h[i][j] = min(h[i][j - 1], h[i + (1 << (j - 1))][j - 1]);
		}
	}
}
int LCP(int a, int b) {
	int res = min(n - a + 1, m - b + 1);
	if (a > n || b > m) return 0;
	a = rk[a], b = rk[b + n + 1];
	if (a > b) swap(a, b);
	int x = __lg(b - a++);
	return min({ h[a][x], h[b - (1 << x) + 1][x], res });
}
int main() {
	scanf("%d%s%s", &k, s + 1, t + 1), n = strlen(s + 1), m = strlen(t + 1);
	for (int i = 1; i <= n; i++) st[i] = s[i];
	st[n + 1] = '$';
	for (int i = 1; i <= m; i++) st[i + n + 1] = t[i];
	BuildSA();
	for (int s = 0; s < m; s++) {
		memset(f, 0xc0, sizeof(f));
		f[0][k] = 0;
		for (int i = 0; i <= k; i++) {
			for (int j = -k; j <= k; j++) {
				if (f[i][j + k] >= 0) {
					f[i][j + k] += LCP(f[i][j + k] + 1, s + f[i][j + k] + j + 1);
					if (i < k) {
						f[i + 1][j + k] = max(f[i + 1][j + k], f[i][j + k] + 1);
						f[i + 1][j + k + 1] = max(f[i + 1][j + k + 1], f[i][j + k]);
						f[i + 1][j + k - 1] = max(f[i + 1][j + k - 1], f[i][j + k] + 1);
					}
				}
			}
		}
		for (int j = min(k, m - n - s), d = 1e9; j >= -min(k, n - 1); j--) {
			for (int i = 1; i <= k; i++) {
				if (f[i][j + k] == n) {
					d = min(d, i);
					break;
				}
			}
			if (d <= k) ans[d]++;
			d++;
		}
	}
	for (int i = 0; i <= k; i++) printf("%d\n", ans[i]);
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 7972kb

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: 397ms
memory: 15280kb

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: 458ms
memory: 15460kb

input:

30
BBAAABAABBBA
ABBABBBBAABAAAABABBBAABAABBAABAAAAAABAABABBAAAABAAAAABABAABAABBABBAAAABBBBAABBABAAABAABAABBBBBABBABABBBBABBBBAAABBABABBBBAAABBBBAAAABABABABABABABAAABBBBBAABAABAABBAABBBAABBBBBBBABAABAABAABABAABAAABAABBBAABABBABBAAABAAAABABABBABBBAAABBBAAAABBBBABABABAABAABBBBBBBBBAABBBABABBBABAABBABBA...

output:

0
645
8230
50302
166666
310121
345469
280387
227200
209178
203013
198561
105134
102164
99771
97730
96058
94730
93633
92720
92060
91525
91143
90831
90585
90419
90288
90200
90120
90068
90035

result:

wrong answer 1st numbers differ - expected: '17', found: '0'