KMP 自动机

相当于 π 函数(KMP 中的 next 数组)的扩展。

δ(i,c) 表示在 KMP 匹配过程中当模式串指针在 i ,接受字符 c 后模式串指针所处的位置。
则 KMP 过程中模式串指针可以被描述为 δ(0,s[1]),δ(δ(1,s[1]),s[2]),

借助 KMP 自动机,我们可以将单次转移时间由均摊 O(1) 变为严格 O(1)。可以在当基于均摊复杂度的 KMP 转移无法保证复杂度时(CF808G)作为替代品。

为了方便在模式串被完全匹配时转移,常在最后加入一个不在字符集中的字符 # (建议设为 \0

考虑构建 KMP 自动机。
一个暴力的做法是利用 π 函数暴力跳,然而复杂度最坏是 O(n2|Σ|)
考虑到当跳到 π[i] 时,后面的过程已被求解 δ(π[i],c) 时所重复。所以只需要跳一次即可。

δ(i,c)={i+1s[i+1]=c0s[1]ci=0δ(π[i],c)Otherwise

时空复杂度 O(n|Σ|)

posted @   pref_ctrl27  阅读(355)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示