http://acm.hdu.edu.cn/showproblem.php?pid=2896
AC自动机的简单题。。。忘记关debug了,wa了一次。。。囧!
View Code
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <set> 5 #include <cstdlib> 6 7 using namespace std; 8 9 const int kind = 128; 10 const int maxn = 201 * 501; 11 12 struct Node{ 13 int fail; 14 int next[kind]; 15 int count; 16 void init(){ 17 fail = -1; 18 count = 0; 19 memset(next, -1, sizeof(next)); 20 } 21 }node[maxn]; 22 23 char keyword[201]; 24 char str[10001]; 25 int head, tail, nodeUsed; 26 int q[maxn]; 27 28 void insert(char *s, int root, int num){ 29 int p = root; 30 int i = 0, index; 31 32 while (s[i]){ 33 index = s[i] - 33; 34 if (node[p].next[index] == -1){ 35 node[p].next[index] = nodeUsed; 36 node[nodeUsed].init(); 37 nodeUsed++; 38 } 39 p = node[p].next[index]; 40 i++; 41 } 42 node[p].count = num; 43 } 44 45 void build(int root){ 46 int i; 47 48 node[root].fail = -1; 49 head = tail = 0; 50 q[head++] = root; 51 while (head != tail){ 52 int temp = q[tail++]; 53 int p = -1; 54 55 for (i = 0; i < kind; i++){ 56 if (node[temp].next[i] != -1){ 57 if (temp == root) node[node[temp].next[i]].fail = root; 58 else{ 59 p = node[temp].fail; 60 while (p != -1){ 61 if (node[p].next[i] != -1){ 62 node[node[temp].next[i]].fail = node[p].next[i]; 63 break; 64 } 65 p = node[p].fail; 66 } 67 if (p == -1) node[node[temp].next[i]].fail = root; 68 } 69 q[head++] = node[temp].next[i]; 70 } 71 } 72 } 73 } 74 75 set<int> virus; 76 77 void query(int root){ 78 int i = 0, index; 79 int p = root; 80 81 virus.clear(); 82 while (str[i]){ 83 index = str[i] - 33; 84 while (node[p].next[index] == -1 && p != root) p = node[p].fail; 85 p = node[p].next[index]; 86 p = (p == -1) ? root : p; 87 88 if (node[p].count) virus.insert(node[p].count); 89 i++; 90 } 91 } 92 93 void traverse(int root){ 94 if (root == -1) return ; 95 printf("root %d\n", root); 96 printf("fail %d\n", node[root].fail); 97 printf("count %d\n", node[root].count); 98 for (int i = 0; i < kind; i++){ 99 if (node[root].next[i] == -1) continue; 100 printf("%c %d\n", i + 'a', node[root].next[i]); 101 } 102 puts(""); 103 for (int i = 0; i < kind; i++){ 104 traverse(node[root].next[i]); 105 } 106 } 107 108 int main(){ 109 int n; 110 111 //freopen("in", "r", stdin); 112 while (~scanf("%d", &n)){ 113 int root = 0; 114 115 node[0].init(); 116 nodeUsed = 1; 117 118 for(int i = 1; i <= n; i++){ 119 scanf("%s", keyword); 120 insert(keyword, root, i); 121 } 122 build(root); 123 //traverse(root); 124 //puts("Built!"); 125 scanf ("%d", &n); 126 127 int cnt = 0; 128 129 for (int i = 1; i <= n; i++){ 130 scanf("%s", str); 131 query(root); 132 133 if (virus.size()){ 134 cnt++; 135 printf("web %d:", i); 136 for (set<int>::iterator ii = virus.begin(); ii != virus.end(); ii++){ 137 printf(" %d", *ii); 138 } 139 puts(""); 140 } 141 } 142 printf("total: %d\n", cnt); 143 } 144 145 return 0; 146 }
——written by Lyon