KMP 以及 border 性质的一些运用
一个 kmp 学了
下文默认文本串为
前缀函数
定义
求取
暴力
高效算法
第一个重要的观察是相邻的前缀函数值至多增加
那么我们就是要往前查找一个尽可能大的
具体地可以依照这个视频来看,讲得非常详细。
模板
不难发现实现起来非常之短。
n = s.size(), m = t.size();
s = t + '?' + s;
for(int i = 1, j = nxt[i - 1] ; i < (int)s.size() ; ++ i) {
while(j && s[i] != s[j]) j = nxt[j - 1];
if(s[i] == s[j]) {
nxt[i] = ++ j;
if(nxt[i] == m) cout << i - m * 2 + 1 << '\n', j = nxt[j - 1];
}
}
KMP
不难发现,将文本串接在模式串后,中间隔一个特殊字符,若出现
例题
CF126B
如图,pos
为当前枚举到的位置,红色部分和蓝色部分为
正序、倒序各求一遍 border 即可。
for(int i = 2 ; i < n ; ++ i)
if(nxt[i][0] == nxt[n - i + nxt[i][0]][1])
if(nxt[i][0] > ans) {
ans = nxt[i][0];
pos = i;
}
if(! ans) cout << "Just a legend";
else
for(int i = 0 ; i < nxt[pos][0] ; ++ i)
cout << s[i];
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!