[模板]洛谷T3808 AC自动机(简单版)

Posted Running-Coder

tags:

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

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<ctime>
  6 #include<cstdlib>
  7 
  8 #include<string>
  9 #include<stack>
 10 #include<queue>
 11 #include<vector>
 12 #include<algorithm>
 13 #include<map>
 14 #include<set>
 15 
 16 #define inf 2147483647
 17 #define ri register int
 18 #define ll long long
 19 
 20 using namespace std;
 21 
 22 inline void read(int &x){
 23     x=0;
 24     char t=getchar();
 25     bool f=0;
 26     
 27     while(t<0 || t>9){
 28         if(t==-)f=1;
 29         t=getchar();
 30     }
 31     
 32     while(t>=0 && t<=9){
 33         x=(x<<3)+(x<<1)+t-0;
 34         t=getchar();
 35     }
 36     
 37     if(f)x=-x;
 38 }
 39 
 40 inline int idx(char t){
 41     return t-a;
 42 }
 43 
 44 struct que{
 45     int q[1000005];
 46     int head,tail;
 47     
 48     inline void clear(){
 49         head=tail=0;
 50     }
 51     
 52     inline bool emp(){
 53         return head==tail;
 54     }
 55     
 56     inline void push(int x){
 57         q[tail]=x;
 58         tail++;
 59         if(tail==1000005)tail=0;
 60     }
 61     
 62     inline void pop(){
 63         head++;
 64         if(head==1000005)head=0;
 65     }
 66     
 67     inline int top(){
 68         return q[head];
 69     }
 70 };
 71 
 72 struct node{
 73     int ch[26];
 74     int val;
 75     int next;
 76     int last;
 77     
 78     inline void make(){
 79         memset(ch,0,sizeof(ch));
 80         val=next=last=0;
 81     }
 82 };
 83 
 84 inline void insert();
 85 inline void bfs();
 86 void work(int);
 87 
 88 node trie[1000005];
 89 int pn=1;
 90 
 91 que q;
 92 
 93 char S[1000005];
 94 int lens;
 95 char T[1000005];
 96 int lent;
 97 
 98 int n,poi=0,c,ans=0;
 99 
100 int main(){
101     trie[0].make();
102     
103     read(n);
104     
105     for(ri i=1;i<=n;i++){
106         scanf("%s",S+1);
107         lens=strlen(S+1);
108         insert();
109     }
110     
111     bfs();
112     
113     scanf("%s",T+1);
114     lent=strlen(T+1);
115     
116     for(ri i=1;i<=lent;i++){
117         c=idx(T[i]);
118         
119         while(poi && !trie[poi].ch[c])poi=trie[poi].next;
120         poi=trie[poi].ch[c];
121         
122         work(poi);
123     }
124     
125     printf("%d\n",ans);
126     
127     return 0;
128 }
129 
130 inline void insert(){
131     int u=0,c;
132     
133     for(ri i=1;i<=lens;i++){
134         c=idx(S[i]);
135         
136         if(!trie[u].ch[c]){
137             trie[pn].make();
138             trie[u].ch[c]=pn;
139             pn++;
140         }
141         
142         u=trie[u].ch[c];
143     }
144     
145     trie[u].val++;
146 }
147 
148 inline void bfs(){
149     int u,v;
150     
151     q.clear();
152     
153     for(ri i=0;i<26;i++)
154         if(trie[0].ch[i])
155             q.push(trie[0].ch[i]);
156     
157     while(!q.emp()){
158         u=q.top();
159         q.pop();
160         
161         for(ri i=0;i<26;i++){
162             v=trie[u].ch[i];
163             
164             if(!v){
165                 trie[u].ch[i]=trie[trie[u].next].ch[i];
166                 continue;
167             }
168             
169             q.push(v);
170             trie[v].next=trie[trie[u].next].ch[i];
171             if(trie[trie[v].next].val)
172                 trie[v].last=trie[v].next;
173             else
174                 trie[v].last=trie[trie[v].next].last;
175         }
176     }
177 }
178 
179 void work(int now){
180     if(now){
181         ans+=trie[now].val;
182         trie[now].val=0;
183         
184         work(trie[now].last);
185     }
186 }

以上是关于[模板]洛谷T3808 AC自动机(简单版)的主要内容,如果未能解决你的问题,请参考以下文章

[模板][P3808]AC自动机(简单版)

P3796 模板AC自动机(加强版)

luogu P3808 模板AC自动机(简单版)

UVALive-4670 Dominating Patterns / 洛谷 3796 模板AC自动机

模板AC自动机(简单版)

AC自动机