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("]\n");

 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\n",ac.query(buf));

109     }

110     return 0;

111 }

 

你可能感兴趣的:(AC自动机)