LG P5410 【模板】扩展 KMP(Z 函数)
注意 z[1]=n
,从下标 开始求 z
!!
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 2e7 + 5; int z[N], p[N], n, m; char a[N], b[N]; void getZ(char *s, int n, int *z) { for(int i = 2; i <= n; i++) z[i] = 0; z[1] = n; for(int i = 2, l = 0, r = 0; i <= n; i++) { if (i <= r) z[i] = min(z[i - l + 1], r - i + 1); while (i + z[i] <= n && s[z[i] + 1] == s[i + z[i]]) ++z[i]; if (i + z[i] - 1 > r) r = i + z[i] - 1, l = i; } } void exkmp(char *s, int n, char *t, int m) { getZ(t, m, z); for(int i = 1, l = 0, r = 0; i <= n; i++) { if (i <= r) p[i] = min(z[i - l + 1], r - i + 1); while (i + p[i] <= n && t[p[i] + 1] == s[i + p[i]]) ++p[i]; if (i + p[i] - 1 > r) r = i + p[i] - 1, l = i; } } int main() { scanf("%s%s", a + 1, b + 1), n = strlen(a + 1), m = strlen(b + 1), exkmp(a, n, b, m); LL ans = 0; for(int i = 1; i <= m; i++) ans ^= (LL)i * (z[i] + 1); printf("%lld\n", ans); ans = 0; for(int i = 1; i <= n; i++) ans ^= (LL)i * (p[i] + 1); printf("%lld\n", ans); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具