zoukankan      html  css  js  c++  java
  • HD2222 Keywords Search(AC自动机入门题)

    然而还不是很懂=_=

      1 #include <iostream>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <cstdio>
      5 #include <queue>
      6 using namespace std;
      7 const int Max = 1000000+100;
      8 char str[Max];
      9 struct node
     10 {
     11     int cnt;
     12     struct node * Next[26];
     13     struct node * fail;
     14     void init()
     15     {
     16         for (int i = 0; i < 26; i++)
     17             Next[i] = NULL;
     18         cnt = 0;
     19         fail = NULL;
     20     }
     21 };
     22 node * root;
     23 void Insert()
     24 {
     25     node * p = root;
     26     int len = strlen(str);
     27     for (int i = 0; i < len; i++)
     28     {
     29         int id = str[i] - 'a';
     30         if (p->Next[id] == NULL)
     31         {
     32             p->Next[id] = new node();
     33             p->Next[id]->init();
     34         }
     35         p = p->Next[id];
     36     }
     37     p->cnt++;
     38 }
     39 void getFail()
     40 {
     41     node * p = root, *temp, *son;
     42     queue<struct node * > que;
     43     que.push(p);
     44     while (!que.empty())
     45     {
     46         temp = que.front();
     47         que.pop();
     48         for (int i = 0; i < 26; i++)
     49         {
     50             son = temp->Next[i];
     51             if (son != NULL)
     52             {
     53                 if (temp == root)
     54                 {
     55                     son->fail = root;
     56                 }
     57                 else
     58                 {
     59                     p = temp->fail;
     60                     while (p)
     61                     {
     62                         if (p->Next[i])
     63                         {
     64                             son->fail = p->Next[i];
     65                             break;
     66                         }
     67                         p = p->fail;
     68                     }
     69                     if (!p)
     70                         son->fail = root;
     71                 }
     72                 que.push(son);
     73             }
     74         }
     75     }
     76 }
     77 void querry()
     78 {
     79     int len, cnt = 0;
     80     len = strlen(str);
     81     node * p, * temp;
     82     p = root;
     83     for (int i = 0; i < len; i++)
     84     {
     85         int pos = str[i] - 'a';
     86         while (!p->Next[pos] && p != root)
     87             p = p->fail;
     88         p = p->Next[pos];
     89         if (!p)
     90             p = root;
     91         temp = p;
     92         while (temp != root)
     93         {
     94             if (temp->cnt >= 0)
     95             {
     96                 cnt += temp->cnt;
     97                 temp->cnt = -1;
     98             }
     99             else
    100                 break;
    101             temp = temp->fail;
    102         }
    103     }
    104     printf("%d
    ", cnt);
    105 }
    106 int main()
    107 {
    108     int test, n;
    109     scanf("%d", &test);
    110     while (test--)
    111     {
    112         root = new node();
    113         root->init();
    114         root->fail = NULL;
    115         scanf("%d", &n);
    116         getchar();
    117         for (int i = 0; i < n; i++)
    118         {
    119             gets(str);
    120             Insert();
    121         }
    122         getFail();
    123         gets(str);
    124         querry();
    125     }
    126     return 0;
    127 }
    View Code
  • 相关阅读:
    oracle安装
    Jmeter入门篇
    DOS常用命令
    SpringBoot中使用JNnit4(一)之Mockito的使用
    SpringBoot中使用JNnit4(入门篇)
    SpringBoot搭建
    SpringBoot中集成Swagger2
    jpa使用过程中出现问题记录[持续更新]
    Python逆向(五)—— Python字节码解读
    Python逆向(四)—— Python内置模块dis.py源码详解
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5444329.html
Copyright © 2011-2022 走看看