hdu 2222 Keywords Search

AC自动机裸题

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 const int maxnode=10000*50+5;
 6 char in[1000000+5];
 7 struct Trie
 8 {
 9     int ch[maxnode][26];
10     int val[maxnode];
11     int fail[maxnode];
12     int sz;
13     void initial(){sz=1;memset(ch[0],0,sizeof(ch[0]));memset(val,0,sizeof(val));}
14     void insert(char *s)
15     {
16         int u=0,n=strlen(s);
17         for(int i=0;i<n;i++)
18         {
19             int c=s[i]-'a';
20             if(!ch[u][c])
21             {
22                 memset(ch[sz],0,sizeof(ch[sz]));
23                 ch[u][c]=sz++;
24             }
25             u=ch[u][c];
26         }
27         val[u]++;
28     }
29     void GetFail()
30     {
31         queue<int> q;
32         fail[0]=0;
33         for(int c=0;c<26;c++)
34         {
35             int u=ch[0][c];
36             if(u)
37             {
38                 fail[u]=0;q.push(u);
39             }
40         }
41         while(!q.empty())
42         {
43             int r=q.front();q.pop();
44             for(int c=0;c<26;c++)
45             {
46                 int u=ch[r][c];
47                 if(!u) continue;
48                 q.push(u);
49                 int v=fail[r];
50                 while(v&&!ch[v][c]) v=fail[v];
51                 fail[u]=ch[v][c];
52             }
53         }
54     }
55     int solve(char *s)
56     {
57         int len=strlen(s);
58         int cnt=0,u=0;
59         for(int i=0;i<len;i++)
60         {
61             int c=s[i]-'a';
62             while(u&&!ch[u][c]) u=fail[u];
63             u=ch[u][c];
64             int tmp=u;
65             while(tmp&&val[tmp]!=-1)
66             {
67                 cnt+=val[tmp];
68                 val[tmp]=-1;
69                 tmp=fail[tmp];
70             }
71         }
72         return cnt;
73     }
74 };
75 Trie trie;
76 int main()
77 {
78     int t,n;
79     scanf("%d",&t);
80     while(t--)
81     {
82         trie.initial();
83         scanf("%d",&n);
84         for(int i=0;i<n;i++)
85         {
86             scanf("%s",in);
87             trie.insert(in);
88         }
89         trie.GetFail();
90         scanf("%s",in);
91         printf("%d\n",trie.solve(in));
92     }
93     return 0;
94 }

 

posted @ 2013-10-12 18:01  sooflow  阅读(136)  评论(0编辑  收藏  举报