【模板】AC自动机

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<queue>
 4 #include<cstring> 
 5 #define N 1000010
 6 #define rg register
 7 using namespace std;
 8 int n,ans,tot,c[N][26],val[N],fail[N];
 9 char s[N];
10 queue<int>q;
11 inline int read(){
12     int k=0,f=1; char c=getchar();
13     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
14     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
15     return k*f;
16 }
17 void insert(char *s){
18     int len=strlen(s),now=0;
19     for(rg int i=0,v;i<len;i++){
20         if(!c[now][v=s[i]-'a']) c[now][v]=++tot;
21         now=c[now][v];
22     }
23     val[now]++;
24 }
25 void build(){
26     for(rg int i=0;i<26;i++)if(c[0][i])fail[c[0][i]]=0,q.push(c[0][i]);
27     while(!q.empty()){
28         int u=q.front(); q.pop();
29         for(rg int i=0;i<26;i++)
30         if(c[u][i])fail[c[u][i]]=c[fail[u]][i],q.push(c[u][i]);
31         else c[u][i]=c[fail[u]][i];
32     }
33 }
34 void query(char *s){
35     int len=strlen(s),now=0;
36     for(rg int i=0;i<len;i++){
37         now=c[now][s[i]-'a'];
38         for(rg int t=now;t&&~val[t];t=fail[t])ans+=val[t],val[t]=-1;
39     }
40 }
41 int main(){
42     n=read();
43     for(rg int i=1;i<=n;i++) scanf("%s",s),insert(s);
44     build();
45     scanf("%s",s); query(s);
46     printf("%d\n",ans);
47     return 0;
48 }
View Code

洛谷 3808

猜你喜欢

转载自www.cnblogs.com/DriverLao/p/8945428.html