AC 自动机(简单版)

具体讲解看OI-wiki就好了

构建字典图的那个位置,只用理解路径压缩就好了;在路径压缩完了之后,tr[u][i]表示的是状态u接上一个字符i所表示的字符串能够与Q所匹配的最大后缀长度。形式化地,设s=u+i,令Ps的后缀集合,tr[u][i]=max(|p|),其中pP且存在vQ使得p=v;这部分代码的时间复杂度显然是O(n||),其中n为AC自动机的节点数目,为字符集

对于匹配部分的代码,u代表的是Q的一个状态,且u为文本串的以第i个字符结尾的后缀与Q匹配的能达到最大长度的位置(结合我们上面的tr[u][i]讲解,不难发现代码的维护可以让u有这一点性质),当前只用统计文本串的以第i个字符结尾的后缀与所有模式串的匹配情况(因为以1 ~ i1结尾的后缀在之前被统计过了),由于u表示的是最大长度,所以只用从u开始一直跳fail指针就好了;而由于出现一个模式串出现了多次只用统计一次,所以可以让e[j]=-1,并且当e[j]==-1时就停止循环,因为在之前已经统计过了;这一部分的时间复杂度为O(|T|+n),因为AC自动机上每个节点最多被遍历一次

效率优化那两块还没学,有时间了学一下

posted @   最爱丁珰  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示