Z函数可以在
原理就是考虑之前的lcp,可以通过之前的lcp这一位和前缀某一位一致,对应到前缀某一位的LCP,再向右扩展。注意到,右边界最多被扩展1次所以是线性复杂度。
struct Z {
int z[MAXN], p[MAXN];
void get_Z(char* s, int n) {
int t = 1, lim; z[1] = 1;
for (int i = 2; i <= n; ++i) {
lim = t + z[t] - 1; //[1,t-1],[t,lim]
if (i + z[i - t + 1] - 1 < lim) {
z[i] = z[i - t + 1];
} else {
z[i] = max(0, lim - i + 1);
while (s[i + z[i]] == s[z[i] + 1])z[i]++;
}
if (i + z[i] > t + z[t])t = i;
}
z[1] = n;
}
void exkmp(char* s, char* u, int n, int m) {
int t = 1, lim;
p[1] = 0;
for (int i = 1; i <= m; ++i) {
lim = t + p[t] - 1; //[1,t-1],[t,lim]
if (i + z[i - t + 1] - 1 < lim) {
p[i] = z[i - t + 1];
} else {
p[i] = max(0, lim - i + 1);
while (u[i + p[i]] == s[p[i] + 1] && p[i] + 1 <= n)p[i]++;
}
if (i + p[i] > t + p[t])t = i;
}
}
}p;
LCP
性质:
- 若字符串
,的 后缀和 后缀的 ,那么长度为 的子串是以 为周期的串。
更进一步,若字符串
- LCS (最长公共后缀)同理。把字符串翻转一遍,求出LCP即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现