hdu 2896(AC自动机)

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <iostream>
  5 
  6 using namespace std;
  7 
  8 const int N = 205;
  9 const int L = 10005;
 10 const int M = 100010;
 11 
 12 int ans[5];
 13 char pat[N], str[L];
 14 struct node {
 15     int n;
 16     node *prefix;
 17     node *child[128];
 18     node() {
 19         n = 0;
 20         prefix = NULL;
 21         for (int i=0; i<128; ++i) child[i] = NULL;
 22     }
 23 }*root, *Q[M];
 24 int front, rear;
 25 
 26 int cmp(const void *a, const void *b) {
 27     return *(int *)a - *(int *)b;
 28 }
 29 
 30 void insert(char pat[], int n) {
 31     node *p = root;
 32     for (int k,i=0; pat[i]; ++i, p=p->child[k]) {
 33         k = (int)pat[i];
 34         if (!p->child[k]) p->child[k] = new node();
 35     }
 36     p->n = n;
 37 }
 38 
 39 void buildAc(node *root) {
 40     node *p, *q;
 41     root->prefix = NULL;
 42     front = rear = 0;
 43     Q[front++] = root;
 44     while (rear < front) {
 45         p = Q[rear++];
 46         for (int i=0; i<128; ++i) {
 47             if (p->child[i]) {
 48                 if (p == root) p->child[i]->prefix = root;
 49                 else {
 50                     q = p->prefix;
 51                     while (q!=root && !q->child[i]) q = q->prefix;
 52                     if (q->child[i]) p->child[i]->prefix = q->child[i];
 53                     else p->child[i]->prefix = root;
 54                 }
 55                 Q[front++] = p->child[i];
 56             }
 57         }
 58     } 
 59 }
 60 
 61 int match(node *root, char str[]) {
 62     node *p = root;
 63     int cnt = 0;
 64     for (int k,i=0; str[i]; ++i) {
 65         k = (int)str[i];
 66         while (p!=root && !p->child[k]) p = p->prefix;
 67         p = p->child[k];
 68         if (!p) p = root;
 69         node *tmp = p;
 70         while (tmp!=root && tmp->n) {
 71             ans[cnt++] = tmp->n;
 72             tmp = tmp->prefix;
 73         }
 74     }
 75     return cnt;
 76 }
 77 
 78 void del(node *p) {
 79     if (!p) return ;
 80     for (int i=0; i<128; ++i) {
 81         if (p->child[i]) del(p->child[i]);
 82     }
 83     delete p;
 84     p = NULL;
 85 }
 86 
 87 int main() {
 88     int n, cs, ss;
 89     while (scanf("%d", &n) != EOF) {
 90         ss = 0;
 91         root = new node();
 92         for (int i=1; i<=n; ++i) scanf("%s", pat), insert(pat, i);
 93         buildAc(root);
 94         scanf ("%d", &n);
 95         for (int i=1; i<=n; ++i) {
 96             scanf ("%s", str);
 97             if (cs = match(root, str)) {
 98                 qsort(ans, cs, sizeof(int), cmp);
 99                 printf ("web %d:", i);
100                 for (int i=0; i<cs; ++i) printf (" %d", ans[i]);
101                 puts("");
102                 ++ss;
103             }
104         }
105         printf ("total: %d\n", ss);
106         del(root);
107     }
108     return 0;
109 }

 

posted on 2012-05-12 20:20  Try86  阅读(324)  评论(1)    收藏  举报