AC自动机

 

 

 

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <string>
 7 #include <queue>
 8 using namespace std;
 9 const int N=510000;
10 struct Tri
11 {
12     int Next[N][26], fail[N], val[N], root, L;
13     void init() {L = 0;root = newnode();}
14     int newnode()
15     {
16         for(int i = 0;i < 26;i++) Next[L][i] = -1;
17         val[L++] = 0;
18         return L - 1;
19     }
20 
21     void insert(char s[])
22     {
23         int len = strlen(s), cur = root;
24         for(int i = 0;i < len;i++)
25         {
26             if(Next[cur][s[i]-'a'] == -1)
27                 Next[cur][s[i]-'a'] = newnode();
28             cur = Next[cur][s[i]-'a'];
29         }
30         val[cur]++;
31     }
32     void build()
33     {
34         queue<int>Q;
35         fail[root] = root;
36         for(int i = 0;i < 26;i++)
37             if(Next[root][i] == -1) Next[root][i] = root;
38             else
39             {
40                 fail[Next[root][i]] = root;
41                 Q.push(Next[root][i]);
42             }
43         while(!Q.empty())
44         {
45             int cur = Q.front(); Q.pop();
46             for(int i = 0;i < 26;i++)
47                 if(Next[cur][i] == -1)
48                     Next[cur][i] = Next[fail[cur]][i];
49                 else
50                 {
51                     fail[Next[cur][i]]=Next[fail[cur]][i];
52                     Q.push(Next[cur][i]);
53                 }
54         }
55     }
56     int query(char s[])
57     {
58         int len = strlen(s), cur = root, res = 0;
59         for(int i = 0;i < len;i++)
60         {
61             cur = Next[cur][s[i]-'a'];
62             int tmp = cur;
63             while (tmp != root)
64             {
65                 res += val[tmp];
66                 val[tmp] = 0;
67                 tmp = fail[tmp];
68             }
69         }
70         return res;
71     }
72 };
73 char s[N];
74 Tri AC;
75 int n;
76 int main()
77 {
78       scanf("%d",&n);
79       AC.init();
80       for(int i = 0;i < n;i++)
81       {
82           scanf("%s",s);
83           AC.insert(s);
84       }
85       AC.build();
86       scanf("%s",s);
87       printf("%d\n",AC.query(s));
88       return 0;
89 }

 

posted @ 2017-01-25 16:01  InWILL  阅读(150)  评论(0)    收藏  举报