AC自动机学习笔记
AC_Automaton=Trie+KMP!
废话
KMP
Trie
AC自动机
AC自动机就是在Trie上建立失配指针,以完成多模式串匹配的数据结构。
建立AC自动机
建立一个AC自动机通常需要两个步骤:
- 基础的TRIE结构:将所有的模式串构成一棵Trie。
- KMP的思想:对Trie树上所有的结点构造失配指针。
然后就可以利用它进行多模式串匹配了。
insert
同Trie(一模一样)。
void insert(string s){ int p=0;//此点编号 for(int i=0;i<s.size();i++){ int x=num(s[i]);//编码 if(!nex[p][x])nex[p][x]=++cnt;//没有点就新建 p=nex[p][x];//更新所在点 b[p]++;//前缀增加 } }
build
运用广搜的思想构建失配指针。
void build(){ queue<int>q; memset(fail,0,sizeof(fail)); for(int i=0;i<26;i++)if(tr[0][i])q.push(nex[0][i]); while(!q.empty()){ int k=q.front();q.pop(); for(int i=0;i<26;i++){ if(nex[k][i]){ fail[tr[k][i]]=nex[fail[k]][i]; q.push(nex[k][i]); } else tr[k][i]=tr[fail[k]][i]; } } }
query
失配指针都建了,查找就很简单了:
int query(string t){ int p=0,res=0; for(int i=0;t[i];i++){ p=nex[p][t[i]-'a']; for(int j=p;j&&b[j]==-1;j=fail[j])res+=b[j],b[j]=-1; } return res; }
本文作者:ccrui
本文链接:https://www.cnblogs.com/ccr-note/p/Aho_Corasick_Automaton.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步