专栏文章
题解:P5410 【模板】扩展 KMP/exKMP(Z 函数)
P5410题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miocxeo6
- 此快照首次捕获于
- 2025/12/02 17:09 3 个月前
- 此快照最后确认于
- 2025/12/02 17:09 3 个月前
当看完这个视频,你可能就懂什么是了,那么,上代码!!!
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
char a[20000010], b[20000010];
int z[20000010], p[20000010], ans1, ans2;
int n, m;
signed main() {
scanf("%s%s", a, b);
n = strlen(a);
m = strlen(b);
z[0] = m;
for (int i = 1, l = 0, r = 0; i < m; i ++) {
if (i <= r) z[i] = min(z[i - l], r - i + 1);
while (i + z[i] < m && b[z[i]] == b[i + z[i]]) z[i] ++;
if (i + z[i] - 1 > r) l = i, r = i + z[i] - 1;
}
for (int i = 0, l = 0, r = 0; i < n; i ++) {
if (i <= r&&i)
p[i] = min(z[i - l], r - i + 1);
while (p[i] < m && i + p[i] < n && b[p[i]] == a[i + p[i]])
p[i] ++;
if (i + p[i] - 1 > r)
l = i,
r = i + p[i] - 1;
}
for (int i = 0; i < m; i ++)
ans1 ^= 1ll * (i + 1) * (z[i] + 1);
for (int i = 0; i < n; i ++)
ans2 ^= 1ll * (i + 1) * (p[i] + 1);
printf("%lld\n%lld\n", ans1, ans2);
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...