zoukankan      html  css  js  c++  java
  • AC自动机 hdu2222

     1 #include <iostream>
     2 using namespace std;
     3 
     4 struct Node{
     5     Node *next[26];
     6     Node* fail;
     7     int count;
     8     Node(){
     9         for (int i = 0; i < 26; i++){
    10             next[i] = NULL;
    11         }
    12         fail = NULL;
    13         count = 0;
    14     }
    15 };
    16 char words[51], s[1000001];
    17 Node* d[500001];
    18 void insert(char words[], Node *root){
    19     int i, len = strlen(words), v;
    20     Node *p = root;
    21     for (i = 0; i < len; i++){
    22         v = words[i] - 'a';
    23         if (p->next[v] == NULL){
    24             p->next[v] = new Node();
    25         }
    26         p = p->next[v];
    27     }
    28     p->count++;
    29 }
    30 void build(Node *root){
    31     int head, tail, i;
    32     Node *p, *temp;
    33     head = 0;
    34     tail = 0;
    35     root->fail = NULL;
    36     d[head] = root;
    37     while (head <= tail){
    38         temp = d[head++];
    39         for (i = 0; i < 26; i++){
    40             if (temp->next[i] == NULL) continue;
    41             if (temp == root){
    42                 temp->next[i]->fail = root;
    43             }
    44             else{
    45                 p = temp->fail;
    46                 while (p != NULL){
    47                     if (p->next[i] != NULL){
    48                         temp->next[i]->fail = p->next[i];
    49                         break;
    50                     }
    51                     p = p->fail;
    52                 }
    53                 if (p == NULL){
    54                     temp->next[i]->fail = root;
    55                 }
    56             }
    57             d[++tail] = temp->next[i];
    58         }
    59     }
    60 }
    61 
    62 int query(char s[], Node* root){
    63     int ans = 0, len = strlen(s), i, v;
    64     Node *p = root, *temp;
    65     for (i = 0; i < len; i++){
    66         v = s[i] - 'a';
    67         while (p->next[v] == NULL && p != root){
    68             p = p->fail;
    69         }
    70         p = (p->next[v] != NULL) ? p->next[v] : root;
    71         temp = p;
    72         while (temp != root&&temp->count != -1){
    73             ans += temp->count;
    74             temp->count = -1;
    75             temp = temp->fail;
    76         }
    77     }
    78     return ans;
    79 }
    80 
    81 int main(){
    82     int m, n, i;
    83     Node *root;
    84     cin >> m;
    85     while (m--){
    86         root = new Node();
    87         cin >> n;
    88         for (i = 0; i < n; i++){
    89             cin >> words;
    90             insert(words, root);
    91         }
    92         build(root);
    93         cin >> s;
    94         cout << query(s, root) << endl;
    95     }
    96 }
    View Code
  • 相关阅读:
    python3监控网站状态
    暴力屏蔽80访问失败的用户
    python3爬取中国药学科学数据
    python3发邮件脚本
    OOP AOP
    lambda
    jni
    Gradle史上最详细解析
    supersocket 遇到的Failed to initialize 和 log4net用法
    在c#中利用keep-alive处理socket网络异常断开的方法
  • 原文地址:https://www.cnblogs.com/macinchang/p/4507088.html
Copyright © 2011-2022 走看看