Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=3065

View Code
 1 //3065
2 #include <cstdio>
3 #include <cstring>
4 #include <cctype>
5 using namespace std;
6
7 const int N=50100,B=26;
8 int trie[N][B];
9 int key[N],cnt[N],fail[N];
10 int sz,id;
11 int que[N];
12 char vac[1010][60];
13 char s[2000010];
14 void insert(char *str)
15 {
16 int p=0;
17 for(int i=0;str[i];i++)
18 {
19 int c=str[i]-'A';
20 if(!trie[p][c]) trie[p][c]=++sz;
21 p=trie[p][c];
22 }
23 key[p]=id;
24 }
25 void AC()
26 {
27 int *front=que, *rear=que;
28 for(int i=0;i<B;i++) if (trie[0][i])
29 {
30 fail[trie[0][i]]=0;
31 *rear++=trie[0][i];
32 }
33 while(front<rear)
34 {
35 int p=*front++;
36 for(int i=0;i<B;i++)
37 if(trie[p][i])
38 {
39 int v=trie[p][i];
40 fail[v]=trie[fail[p]][i];
41 *rear++=v;
42 }
43 else trie[p][i]=trie[fail[p]][i];
44 }
45 }
46 int match(char *s)
47 {
48 int p=0;
49 for(int i=0;s[i];i++)
50 {
51 if(!isupper(s[i])) {p=0; continue;}
52 int c=s[i]-'A';
53 p=trie[p][c];
54 for(int j=p;j;j=fail[j])
55 if(key[j]) cnt[key[j]]++;
56 }
57 }
58 int main()
59 {
60 int n;
61 while(~scanf("%d",&n))
62 {
63 memset(trie,0,sizeof(trie));
64 memset(key,0,sizeof(key));
65 memset(cnt,0,sizeof(cnt));
66 memset(fail,0,sizeof(fail));
67 sz=id=0;
68 for(int i=0;i<n;i++)
69 {
70 scanf("%s",vac[++id]);
71 insert(vac[id]);
72 }
73 AC();
74 scanf("%s",s);
75 match(s);
76 for(int i=1;i<=n;i++) if(cnt[i])
77 printf("%s: %d\n",vac[i],cnt[i]);
78 }
79 return 0;
80 }

 

posted on 2012-03-28 21:09  Qiuqiqiu  阅读(124)  评论(0编辑  收藏  举报