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]);
 }
}
posted @ 2016-12-12 22:53  Krew  阅读(103)  评论(0)    收藏  举报