AC自动机
AC自动机
当匹配问题中的模板变为多个时,KMP算法就显得力不从心了,这时我们就需要一个AC自动机来进行匹配,原理上就是先构造一棵Trie,连出失配边,然后在Trie上进行匹配
代码:
void init()
{
memset(ch,0,sizeof(ch));
memset(last,0,sizeof(last));
memset(f,0,sizeof(f));
memset(let,0,sizeof(let));
memset(cnt,0,sizeof(cnt));
size=0;
rep(i,0,maxnode-1) word[i].clear();
}
void insert(char *s,int n,int x)
{
cur=0;
rep(i,1,n)
{
k=(int)(s[i]-'a'+1);
if (!ch[cur][k]) ch[cur][k]=++size,let[size]=s[i];
cur=ch[cur][k];
}
word[cur].push_back(x);
}
void get_fail()
{
queue<int> Q;
f[0]=0;
rep(i,1,csize-1) if (ch[0][i]) Q.push(ch[0][i]),last[ch[0][i]]=0,f[ch[0][i]]=0;
while (!Q.empty())
{
k=Q.front(); Q.pop();
rep(i,1,csize-1)
{
if (!ch[k][i]) {ch[k][i]=ch[f[k]][i];continue;} else v=ch[k][i],Q.push(v);
cur=f[k];
while (cur && (!ch[cur][i])) cur=f[cur];
if (ch[cur][i]) cur=ch[cur][i];
f[v]=cur;
last[v]=(word[f[v]].empty())?(last[f[v]]):(f[v]);
}
}
}
void find(char *s,int n)
{
cur=0;
rep(i,1,n)
{
k=(int)(s[i]-'a'+1);
cur=ch[cur][k];
if (!word[cur].empty()) calc(cur); else calc(last[cur]);
}
}

浙公网安备 33010602011771号