• 【HDU】2222 Keywords Search


     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #define MAXN 1000000
     5 #define MAXM 26
     6 using namespace std;
     7 char str[MAXN];
     8 int size, ans;
     9 struct node {
    10     int fail, cnt, next[MAXM];
    11     bool vis;
    12     void Init() {
    13         fail = cnt = 0;
    14         vis = false;
    15         memset(next, 0, sizeof(next));
    16     }
    17 };
    18 node tree[MAXN];
    19 inline int GET(char ch) {
    20     return ch - 'a';
    21 }
    22 void Insert(char *s) {
    23     int now, t;
    24     for (now = 0; *s; s++) {
    25         t = GET(*s);
    26         if (!tree[now].next[t]) {
    27             tree[++size].Init();
    28             tree[now].next[t] = size;
    29         }
    30         now = tree[now].next[t];
    31     }
    32     tree[now].cnt++;
    33 }
    34 void BFS() {
    35     int now, i, temp;
    36     queue<int> q;
    37     q.push(0);
    38     while (!q.empty()) {
    39         now = q.front();
    40         q.pop();
    41         for (i = 0; i < MAXM; i++) {
    42             if (tree[now].next[i]) {
    43                 temp = tree[now].next[i];
    44                 if (now)
    45                     tree[temp].fail = tree[tree[now].fail].next[i];
    46                 q.push(temp);
    47             } else
    48                 tree[now].next[i] = tree[tree[now].fail].next[i];
    49         }
    50     }
    51 }
    52 void Match(char *s) {
    53     int now, t, temp;
    54     for (now = 0; *s; s++) {
    55         t = GET(*s);
    56         now = tree[now].next[t];
    57         for (temp = now; temp && !tree[temp].vis; temp = tree[temp].fail) {
    58             ans += tree[temp].cnt;
    59             tree[temp].vis = true;
    60         }
    61     }
    62 }
    63 int main() {
    64     int c, n;
    65     scanf("%d", &c);
    66     while (c--) {
    67         scanf("%d", &n);
    68         tree[0].Init();
    69         for (size = ans = 0; n--;) {
    70             scanf(" %s", str);
    71             Insert(str);
    72         }
    73         BFS();
    74         scanf(" %s", str);
    75         Match(str);
    76         printf("%d\n", ans);
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    spring之aop概念和配置
    netty概念
    maven使用实例记录
    maven概念
    Runtime.getRuntime().addShutdownHook
    aop前传之代理
    实例化bean的三种方式
    easyui datagrid treegrid 取消行选中、取消高亮
    sqlserver 保存 立方米(m³)
    sqlserver 备份集中的数据库备份与现有的 'XXX' 数据库不同。
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2617598.html
Copyright © 2020-2023  润新知