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;
}