zoukankan      html  css  js  c++  java
  • 【HDOJ】2222 Keywords Search

    AC自动机基础题。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <queue>
      6 using namespace std;
      7 
      8 #define MAXL  1000005
      9 #define TRIEN 26
     10 
     11 char des[MAXL], src[55];
     12 
     13 typedef struct Trie {
     14     int n;
     15     Trie *fail;
     16     Trie *next[TRIEN];
     17     Trie () {
     18         n = 0;
     19         fail = NULL;
     20         memset(next, 0, sizeof(next));
     21     }
     22 } Trie;
     23 
     24 Trie *root;
     25 int n;
     26 
     27 void create(char str[]) {
     28     int i=0, id;
     29     Trie *p = root, *q;
     30 
     31     while (str[i]) {
     32         id = str[i] - 'a';
     33         ++i;
     34         if (p->next[id] == NULL) {
     35             q = new Trie();
     36             p->next[id] = q;
     37         }
     38         p = p->next[id];
     39     }
     40     p->n++;
     41 }
     42 
     43 void build_fail() {
     44     int i;
     45     Trie *p, *q;
     46     queue<Trie *> que;
     47 
     48     for (i=0; i<TRIEN; ++i) {
     49         if (root->next[i]) {
     50             root->next[i]->fail = root;
     51             que.push(root->next[i]);
     52         }
     53     }
     54 
     55     while (!que.empty()) {
     56         p = que.front();
     57         que.pop();
     58         for (i=0; i<TRIEN; ++i) {
     59             if (p->next[i]) {
     60                 q = p->fail;
     61                 while (q != NULL) {
     62                     if (q->next[i]) {
     63                         p->next[i]->fail = q->next[i];
     64                         break;
     65                     }
     66                     q = q->fail;
     67                 }
     68                 if (q == NULL)
     69                     p->next[i]->fail = root;
     70                 que.push(p->next[i]);
     71             }
     72         }
     73     }
     74 }
     75 
     76 void search() {
     77     int i = 0, id;
     78     Trie *p = root, *tmp;
     79 
     80     n = 0;
     81 
     82     while (des[i]) {
     83         id = des[i] - 'a';
     84         ++i;
     85         while (p->next[id]==NULL && p!=root)
     86             p = p->fail;
     87         p = p->next[id];
     88         if (p == NULL)
     89             p = root;
     90         tmp = p;
     91         while (tmp != root) {
     92             n += tmp->n;
     93             tmp->n = 0;
     94             tmp = tmp->fail;
     95         }
     96     }
     97 }
     98 
     99 void del(Trie *t) {
    100     if (t == NULL)
    101         return ;
    102     for (int i=0; i<TRIEN; ++i)
    103         del(t->next[i]);
    104     free(t);
    105 }
    106 
    107 int main() {
    108     int case_n;
    109 
    110     scanf("%d", &case_n);
    111     while (case_n--) {
    112         scanf("%d", &n);
    113         root = new Trie();
    114         while (n--) {
    115             scanf("%s", src);
    116             create(src);
    117         }
    118         scanf("%s", des);
    119         build_fail();
    120         search();
    121         printf("%d
    ", n);
    122         del(root);
    123     }
    124 
    125     return 0;
    126 }
  • 相关阅读:
    hdu2846 Repository
    Ajax:js自执行函数、jsonp、cros
    python读写Excel文件--使用xlrd模块读取,xlwt模块写入
    CentOS上快速安装saltstack
    Django_Form表单补充
    前端基础之Bootstrap介绍
    前端基础之jquery练习
    前端基础之Http协议
    Django_随机验证码
    dpkg --add-architecture i386 && apt-get update && > apt-get install wine32
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3814969.html
Copyright © 2011-2022 走看看