扩展KMP
前言
扩展KMP又称Z函数,可以快速的求出一个字符串的每一个后缀的与其的LCP(最大公共前缀)长度。
至于为什么要学习exKMP
,因为(数据规模很上进)我们都是上进的OIer。
算法思路
暴力朴素的算法
将
CODE
for(int i=1;i<n;i++)
{
while(z[i]+i<n&&s[z[i]]==s[z[i]+i]) z[i]++;
}
由于上述算法太朴实无华了,所以我们的时间复杂度也很朴实无华达到
exKMP
为了解决上述过分朴实无华的时间复杂度,exKMP
学会了剥削利用一切可以利用的数据。
在exKMP中,我们从
由z数值的定义可知,
举个例子:
S={aaabb}(i=0,4),当
理解上面后,我们来计算
1.若
1.1若
因为
而且
1.2若优质的食材往往使用最朴素的烹饪方法)(
2.若
注意每次求出z[i]后都要看当前的z[i]是否可以更新l和r。
代码:
for(int i=1,l=0,r=0;i<m;i++)
{
if(i<=r&&z[i-l]<r-i+1) z[i]=z[i-l];//1.1的情况
else
{
z[i]=max(0,r-i+1);//1.2或2的情况对z[i]的更新
while(i+z[i]<n&&b[z[i]]==b[i+z[i]]) z[i]++;//暴力求法
}
if(i+z[i]-1>r) l=i,r=i+z[i]-1;//更新l,r
}
exKMP
的时间复杂度
虽然我们看似进行了很多次的朴素方法,但是我们使用暴力求法时都是exKMP
来说,下同),而外围循环求
后记
如果是两个字符串要求z函数,我们把他们拼成一条字符串,并且在连接处增加一个不属于这两个字符串的字符,就可以回归上述做法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2023-10-24 2023NOIP A层联测16 T3 货物运输