[HDU2222 ]

[关键字]:字符串

[题目大意]:求给出的单词在文章中出现了几次。

//=====================================================================================================

[分析]:裸的AC自动机模板。首先以所给出的所有字母构建trie树,对文章进行多模式匹配。

[代码]:

View Code
  1 #include<iostream>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<algorithm>
5 #include<cstring>
6 #include<queue>
7 using namespace std;
8
9 struct node
10 {
11 node *next[26],*fail;
12 int count;
13 node()
14 {
15 fail=NULL;
16 count=0;
17 memset(next,0,sizeof(next));
18 }
19 };
20 queue<node*> q;
21 char word[60],str[1000002];
22
23 int ins(char *str,node *root)
24 {
25 node *p=root;
26 int i=0,index;
27 while (str[i])
28 {
29 index=str[i]-'a';
30 if (!p->next[index]) p->next[index]=new node();
31 p=p->next[index];
32 i++;
33 }
34 p->count++;
35 return 0;
36 }
37
38 int build(node *root)
39 {
40 root->fail=NULL;
41 q.push(root);
42 while (!q.empty())
43 {
44 node *p=NULL;
45 node *temp=q.front();
46 q.pop();
47 for (int i=0;i<26;i++)
48 if (temp->next[i])
49 {
50 if (temp==root) temp->next[i]->fail=root;
51 else
52 {
53 p=temp->fail;
54 while (p)
55 {
56 if (p->next[i]) {temp->next[i]->fail=p->next[i];break;}
57 p=p->fail;
58 }
59 if (!p) temp->next[i]->fail=root;
60 }
61 q.push(temp->next[i]);
62 }
63 }
64 return 0;
65 }
66
67 int solve(node *root)
68 {
69 int i=0,cut=0,index,len=strlen(str);
70 node *p=root;
71 while (str[i])
72 {
73 index=str[i]-'a';
74 while (!p->next[index] && p!=root) p=p->fail;
75 p=p->next[index];
76 p=(p==NULL)?root:p;
77 node *temp=p;
78 while (temp!=root && temp->count!=-1)
79 {
80 cut+=temp->count;
81 temp->count=-1;
82 temp=temp->fail;
83 }
84 i++;
85 }
86 return cut;
87 }
88
89 int main()
90 {
91 int tt;
92 scanf("%d",&tt);
93 while (tt--)
94 {
95 node *root=new node();
96 int n;
97 scanf("%d\n",&n);
98 for (int i=1;i<=n;i++)
99 {
100 gets(word);
101 ins(word,root);
102 //printf("%s\n",word);
103 }
104 build(root);
105 scanf("%s",str);
106 //printf("%s\n",str);
107 printf("%d\n",solve(root));
108 }
109 system("pause");
110 return 0;
111 }



你可能感兴趣的:(HDU)