【HDOJ】2896 病毒侵袭
AC自动机模板题。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define TRIEN 128 8 #define MAXN 505 9 10 typedef struct Trie { 11 int in; 12 Trie *fail; 13 Trie *next[TRIEN]; 14 Trie() { 15 in = 0; 16 fail = NULL; 17 memset(next, 0, sizeof(next)); 18 } 19 } Trie; 20 21 Trie *root; 22 char src[205], des[10005]; 23 bool visit[MAXN]; 24 25 void create(char str[], int in) { 26 int i = 0, id; 27 Trie *p = root, *q; 28 29 while (str[i]) { 30 id = str[i]; 31 ++i; 32 if (p->next[id] == NULL) { 33 q = new Trie(); 34 p->next[id] = q; 35 } 36 p = p->next[id]; 37 } 38 p->in = in; 39 } 40 41 void build_fail() { 42 int i; 43 Trie *p, *q; 44 queue<Trie *> que; 45 46 for (i=0; i<TRIEN; ++i) { 47 if (root->next[i]) { 48 root->next[i]->fail = root; 49 que.push(root->next[i]); 50 } 51 } 52 53 while (!que.empty()) { 54 p = que.front(); 55 que.pop(); 56 for (i=0; i<TRIEN; ++i) { 57 if (p->next[i]) { 58 q = p->fail; 59 while (q != NULL) { 60 if (q->next[i]) { 61 p->next[i]->fail = q->next[i]; 62 break; 63 } 64 q = q->fail; 65 } 66 if (q == NULL) 67 p->next[i]->fail = root; 68 que.push(p->next[i]); 69 } 70 } 71 } 72 } 73 74 void search() { 75 int i = 0, id; 76 Trie *p = root, *tmp; 77 78 while (des[i]) { 79 id = des[i]; 80 ++i; 81 while (p->next[id]==NULL && p!=root) 82 p = p->fail; 83 p = p->next[id]; 84 if (p == NULL) 85 p = root; 86 tmp = p; 87 while (tmp != root) { 88 visit[tmp->in] = true; 89 tmp = tmp->fail; 90 } 91 } 92 } 93 94 void del(Trie *t) { 95 if (t == NULL) 96 return ; 97 for (int i=0; i<TRIEN; ++i) 98 del(t->next[i]); 99 delete t; 100 } 101 102 int main() { 103 int n, m, cnt, total; 104 int i; 105 106 while (scanf("%d",&n) != EOF) { 107 root = new Trie(); 108 for (i=1; i<=n; ++i) { 109 scanf("%s", src); 110 create(src, i); 111 } 112 build_fail(); 113 scanf("%d", &m); 114 total = 0; 115 for (i=1; i<=m; ++i) { 116 scanf("%s", des); 117 memset(visit, false, sizeof(visit)); 118 search(); 119 cnt = 0; 120 for (int j=1; j<=n; ++j) { 121 if (visit[j]) { 122 if (!cnt) 123 printf("web %d:", i); 124 ++cnt; 125 printf(" %d", j); 126 } 127 } 128 if (cnt) { 129 printf("\n"); 130 ++total; 131 } 132 } 133 printf("total: %d\n", total); 134 del(root); 135 } 136 137 return 0; 138 }