zoukankan      html  css  js  c++  java
  • 【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("
    ");
    130                 ++total;
    131             }
    132         }
    133         printf("total: %d
    ", total);
    134         del(root);
    135     }
    136 
    137     return 0;
    138 }
  • 相关阅读:
    BZOJ3744 : Gty的妹子序列
    BZOJ2827 : 千山鸟飞绝
    BZOJ3547 : [ONTAK2010]Matchings
    BZOJ1185 : [HNOI2007]最小矩形覆盖
    BZOJ3046 : lagoon
    BZOJ3743 : [Coci2014]Kamp
    BZOJ3742 : Painting
    iOS移动开发周报-第25期
    适合码农工作时玩的游戏:Scrum
    iOS移动开发周报-第24期
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3815895.html
Copyright © 2011-2022 走看看