hdu 2222 ac自动机模板题

题意

Sample Input
1
5
she
he
say
shr
her
yasherhs


Sample Output
3

  1 #include <stdio.h>
  2 #include <algorithm>
  3 #include <iostream>
  4 #include <string.h>
  5 #include <queue>
  6 using namespace std;
  7 struct Trie
  8 {
  9     int next[500010][26],fail[500010],end[500010];
 10     int root,L;
 11     int newnode()
 12     {
 13         for(int i = 0;i < 26;i++)
 14         next[L][i] = -1;
 15         end[L++] = 0;
 16         return L-1;
 17     }
 18     void init()
 19     {
 20         L = 0;
 21         root = newnode();
 22     }
 23     void insert(char buf[])
 24     {
 25         int len = strlen(buf);
 26         int now = root;
 27         for(int i = 0;i < len;i++)
 28         {
 29             if(next[now][buf[i]-'a'] == -1)
 30             next[now][buf[i]-'a'] = newnode();
 31             now = next[now][buf[i]-'a'];
 32         }
 33         end[now]++;
 34     }
 35     void build()
 36     {
 37         queue<int>Q;
 38         fail[root] = root;
 39         for(int i = 0;i < 26;i++)
 40         if(next[root][i] == -1)
 41         next[root][i] = root;
 42         else
 43         {
 44             fail[next[root][i]] = root;
 45             Q.push(next[root][i]);
 46         }
 47         while( !Q.empty() )
 48         {
 49             int now = Q.front();
 50             Q.pop();
 51             for(int i = 0;i < 26;i++)
 52             if(next[now][i] == -1)
 53             next[now][i] = next[fail[now]][i];
 54             else
 55             {
 56                 fail[next[now][i]]=next[fail[now]][i];
 57                 Q.push(next[now][i]);
 58             }
 59         }
 60     }
 61     int query(char buf[])
 62     {
 63         int len = strlen(buf);
 64         int now = root;
 65         int res = 0;
 66         for(int i = 0;i < len;i++)
 67         {
 68             now = next[now][buf[i]-'a'];
 69             int temp = now;
 70             while( temp != root )
 71             {
 72                 res += end[temp];
 73                 end[temp] = 0;
 74                 temp = fail[temp];
 75             }
 76         }
 77         return res;
 78     }
 79     void debug()
 80     {
 81         for(int i = 0;i < L;i++)
 82         {
 83             printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]);
 84             for(int j = 0;j < 26;j++)
 85             printf("%2d",next[i][j]);
 86             printf("]
");
 87         }
 88     }
 89 };
 90 char buf[1000010];
 91 Trie ac;
 92 int main()
 93 {
 94     int T;
 95     int n;
 96     scanf("%d",&T);
 97     while( T-- )
 98     {
 99         scanf("%d",&n);
100         ac.init();
101         for(int i = 0;i < n;i++)
102         {
103             scanf("%s",buf);
104             ac.insert(buf);
105         }
106         ac.build();
107         scanf("%s",buf);
108         printf("%d
",ac.query(buf));
109     }
110     return 0;
111 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4441918.html