HDOJ 2222 AC自动机

链接:

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

代码:

 31 string s;
 32 
 33 struct node {
 34     node *fail;
 35     node *next[26];
 36     int count;
 37     node() {
 38         fail = NULL;
 39         count = 0;
 40         rep(i, 0, 26) next[i] = NULL;
 41     }
 42 }*root;
 43 queue<node*> que;
 44 
 45 void insert(string s) {
 46     node *p = root;
 47     int len = s.length();
 48     rep(i, 0, len) {
 49         int temp = s[i] - 'a';
 50         if (p->next[temp] == NULL) p->next[temp] = new node();
 51         p = p->next[temp];
 52     }
 53     p->count++;
 54 }
 55 
 56 void build_ac() {
 57     que.push(root);
 58     while (!que.empty()) {
 59         node *p = que.front(); que.pop();    
 60         rep(i, 0, 26) if (p->next[i] != NULL) {
 61             if (p == root) p->next[i]->fail = root;
 62             else {
 63                 node *temp = p->fail;
 64                 while (temp != NULL) {
 65                     if (temp->next[i] != NULL) {
 66                         p->next[i]->fail = temp->next[i];
 67                         break;
 68                     }
 69                     temp = temp->fail;
 70                 }
 71                 if (temp == NULL) p->next[i]->fail = root;
 72             }
 73             que.push(p->next[i]);
 74         }
 75     }
 76 }
 77 
 78 int query() {
 79     int res = 0;
 80     node *p = root;
 81     int len = s.length();
 82     rep(i, 0, len) {
 83         int index = s[i] - 'a';
 84         while (p->next[index] == NULL && p != root) p = p->fail;
 85         p = p->next[index];
 86         if (p == NULL) p = root;
 87         node *temp = p;
 88         while (temp != root && temp->count != -1) {
 89             res += temp->count;
 90             temp->count = -1;
 91             temp = temp->fail;
 92         }
 93     }
 94     return res;
 95 }
 96 
 97 int main() {
 98     ios::sync_with_stdio(false), cin.tie(0);
 99     int T;
100     cin >> T;
101     while (T--) {
102         root = new node();
103         int n;
104         cin >> n;
105         while (n--) {
106             cin >> s;
107             insert(s);
108         }
109         build_ac();
110         cin >> s;
111         cout << query() << endl;
112     }
113     return 0;
114 }

 

posted @ 2017-05-01 21:20  Flowersea  阅读(308)  评论(4编辑  收藏  举报