• [HIHO1036] Trie图(AC自动机)


    题目链接:http://hihocoder.com/problemset/problem/1036

    不知道为什么匹配到某点存在next[idx]的时候,只需要检查这一个sign就行,如果检查此点的fail的sign就会TLE。

    大概数据比较弱能让我水过吧。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef struct Node {
     5     Node* fail;
     6     Node* next[26];
     7     bool sign;
     8     Node() { fail = NULL; for(int i = 0; i < 26; i++) next[i] = NULL; }
     9 }Node;
    10 
    11 const int maxn = 1000100;
    12 Node* rt;
    13 int n;
    14 char tmp[maxn];
    15 
    16 void insert(Node* rt, char* str) {
    17     Node* tmp = rt;
    18     for(int i = 0; str[i]; i++) {
    19         int idx = str[i] - 'a';
    20         if(tmp->next[idx] == NULL) tmp->next[idx] = new Node();
    21         tmp = tmp->next[idx];
    22     }
    23     tmp->sign = 1;
    24 }
    25 
    26 void build(Node* rt) {
    27     Node* cur;
    28     Node* tmp;
    29     queue<Node*> q;
    30     q.push(rt);
    31     while(!q.empty()) {
    32         cur = q.front(); q.pop();
    33         for(int i = 0; i < 26; i++) {
    34             if(!cur->next[i]) continue;
    35             if(cur == rt) cur->next[i]->fail = rt;
    36             else {
    37                 tmp = cur->fail;
    38                 do {
    39                     if(tmp->next[i]) {
    40                         cur->next[i]->fail = tmp->next[i];
    41                         break;
    42                     }
    43                 } while(tmp = tmp->fail);
    44                 if(tmp == NULL) cur->next[i]->fail = rt;
    45             }
    46             q.push(cur->next[i]);
    47         }
    48     }
    49 }
    50 
    51 bool query(Node* rt, char* str) {
    52     Node* cur = rt;
    53     for(int i = 0; str[i]; i++) {
    54         int idx = str[i] - 'a';
    55         while(cur->next[idx] == NULL && cur != rt) cur = cur->fail;
    56         cur = cur->next[idx];
    57         if(cur == NULL) {
    58             cur = rt;
    59             continue;
    60         }
    61         if(cur->sign) return 1;
    62     }
    63     return 0;
    64 }
    65 
    66 int main() {
    67     // freopen("in", "r", stdin);
    68     while(~scanf("%d", &n)) {
    69         rt = new Node();
    70         for(int i = 0; i < n; i++) {
    71             scanf("%s", tmp);
    72             insert(rt, tmp);
    73         }
    74         build(rt);
    75         scanf("%s", tmp);
    76         if(query(rt, tmp)) puts("YES");
    77         else puts("NO");
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    __all__
    python内置函数
    qZnF新存马王至许观制两利各
    PHP中获取当前页面的完整URL
    DedeCms用tag调用全站相关文章
    dedecms如何利用tag来调取相关文章
    SQL Server TempDB
    SQL Server Pivot 隐藏group
    Rebind and Rewind in Execution Plans
    batch 数字进制的问题
  • 原文地址:https://www.cnblogs.com/kirai/p/6756852.html
Copyright © 2020-2023  润新知