{AC自动机}

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了{AC自动机}相关的知识,希望对你有一定的参考价值。

开始搞ac自动机啦

之前看着费劲的现在轻易就理解了,剩下的就是多做题了

 

先来个模板题

题目链接:HihoCoder - 1036

技术分享
  1 #include <cstdio>
  2 #include <cstring>
  3 const int maxn=1000010;
  4 
  5 int n;
  6 char s[maxn],p[maxn];
  7 struct Trie
  8 {
  9     int ct;
 10     Trie *fail;
 11     Trie *nex[26];
 12     Trie()
 13     {
 14         ct=0;
 15         fail=NULL;
 16         for(int i=0;i<26;i++)
 17             nex[i]=NULL;
 18     }
 19 };
 20 
 21 Trie *rt;
 22 Trie *q[maxn];
 23 int head,tail;
 24 void inser(char *p)
 25 {
 26     Trie *tp=rt;
 27     int pl=strlen(p);
 28     for(int i=0;i<pl;i++)
 29     {
 30         int k=p[i]-a;
 31         if(tp->nex[k]==NULL)
 32         {
 33             Trie *node=new Trie();
 34             tp->nex[k]=node;
 35         }
 36         tp=tp->nex[k];
 37     }
 38     tp->ct++;
 39 }
 40 void getfail()
 41 {
 42     q[tail++]=rt;
 43     while(head!=tail)
 44     {
 45         Trie *now=q[head++];
 46         Trie *temp=NULL;
 47         for(int i=0;i<26;i++)
 48         {
 49             if(now->nex[i]!=NULL)
 50             {
 51                 if(now==rt) now->nex[i]->fail=rt;  //
 52                 else
 53                 {
 54                     temp=now->fail;
 55                     while(temp!=NULL)
 56                     {
 57                         if(temp->nex[i]!=NULL)
 58                         {
 59                             now->nex[i]->fail=temp->nex[i];
 60                             break;
 61                         }
 62                         temp=temp->fail;
 63                     }
 64                     if(temp==NULL) now->nex[i]->fail=rt; //
 65                 }
 66                 q[tail++]=now->nex[i];
 67             }
 68         }
 69     }
 70 }
 71 int query(char *s)
 72 {
 73     int len=strlen(s);
 74     int ans=0;
 75     Trie *now=rt;
 76     for(int i=0;i<len;i++)
 77     {
 78         int k=s[i]-a;
 79         while(now->nex[k]==NULL&&now!=rt)
 80             now=now->fail;
 81         now=now->nex[k];
 82         if(now==NULL) now=rt;
 83         Trie *temp=now;
 84         while(temp!=rt&&temp->ct!=-1)
 85         {
 86             ans+=temp->ct;
 87             temp->ct=-1;
 88             temp=temp->fail;
 89         }
 90     }
 91     return ans;
 92 }
 93 int main()
 94 {
 95     while(scanf("%d",&n)!=EOF)
 96     {
 97         head=tail=0;
 98         rt=new Trie();
 99         for(int i=0;i<n;i++)
100         {
101             scanf("%s",p);
102             inser(p);
103         }
104         getfail();
105         scanf("%s",s);
106         if(query(s)) puts("YES");
107         else puts("NO");
108     }
109 }
View Code

 

以上是关于{AC自动机}的主要内容,如果未能解决你的问题,请参考以下文章

POJ3691DNA repair(AC自动机,DP)

HDU4057 Rescue the Rabbit(AC自动机+状压DP)

Codeforces 86C Genetic engineering(AC自动机+DP)

POJ1699 Best Sequence(AC自动机+状压DP)

POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

HDU2457 DNA repair(AC自动机+DP)