{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 }
以上是关于{AC自动机}的主要内容,如果未能解决你的问题,请参考以下文章
HDU4057 Rescue the Rabbit(AC自动机+状压DP)
Codeforces 86C Genetic engineering(AC自动机+DP)
POJ1699 Best Sequence(AC自动机+状压DP)