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

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

AC自动机

View Code
 1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 using namespace std;
5
6 const int N=60010,B=128;
7 int trie[N][B];
8 int fail[N];
9 int key[N];
10 int size,id;
11 int que[N];
12 char w[10010];
13 int web[5],nw,total;
14 void insert(char *s)
15 {
16 int p=0,i;
17 for (i=0;s[i];i++)
18 {
19 int c=s[i];
20 if (!trie[p][c]) trie[p][c]=++size;
21 p=trie[p][c];
22 }
23 key[p]=++id;
24 }
25 void AC()
26 {
27 int front,rear,u,v,i;
28 front=rear=0;
29 for (i=0;i<B;i++)
30 if (v=trie[0][i]) que[rear++]=v;
31 while (front<rear)
32 {
33 u=que[front++];
34 for (i=0;i<B;i++) if (v=trie[u][i])
35 {
36 fail[v]=trie[fail[u]][i];
37 que[rear++]=v;
38 }
39 else trie[u][i]=trie[fail[u]][i];
40 }
41 }
42 void query(char *s)
43 {
44 int p=0,i;
45 for (i=0;s[i];i++)
46 {
47 p=trie[p][s[i]];
48 for (int q=p;q;q=fail[q]) if (key[q])
49 {
50 int t=key[q],flag=1;;
51 for (int j=0;j<nw;j++)
52 if (t==web[j]) flag=0;
53 if (flag) web[nw++]=t;
54 if (nw==3) return;
55 }
56 }
57 }
58 int main()
59 {
60 int n,m,i;
61 while (~scanf("%d",&n))
62 {
63 memset(trie,0,sizeof(trie));
64 memset(fail,0,sizeof(fail));
65 memset(key,0,sizeof(key));
66 size=id=total=0;
67 for (i=1;i<=n;i++)
68 {
69 scanf("%s",w);
70 insert(w);
71 }
72 AC();
73 scanf("%d",&m);
74 for (i=1;i<=m;i++)
75 {
76 scanf("%s",w);
77 nw=0;
78 query(w);
79 sort(web,web+nw);
80 if (nw)
81 {
82 printf("web %d:",i);
83 for (int j=0;j<nw;j++) printf(" %d",web[j]);
84 printf("\n");
85 total++;
86 }
87 }
88 printf("total: %d\n",total);
89 }
90 return 0;
91 }

 

posted on 2012-03-14 07:54  Qiuqiqiu  阅读(222)  评论(0编辑  收藏  举报