zoukankan      html  css  js  c++  java
  • 【HDU】3065 病毒侵袭持续中

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #define MAXN 2000010
     5 #define MAXM 50000
     6 #define MAXL 128
     7 using namespace std;
     8 char str[MAXN], dic[MAXM][60];
     9 int size, cnt[MAXM];
    10 struct node {
    11     int pos, fail, next[MAXL];
    12     void Init() {
    13         pos = fail = 0;
    14         memset(next, 0, sizeof(next));
    15     }
    16 };
    17 node tree[MAXM];
    18 void Insert(char *s, int pos) {
    19     int now, t;
    20     for (now = 0; *s; s++) {
    21         t = *s;
    22         if (!tree[now].next[t]) {
    23             tree[++size].Init();
    24             tree[now].next[t] = size;
    25         }
    26         now = tree[now].next[t];
    27     }
    28     tree[now].pos = pos;
    29 }
    30 void BFS() {
    31     int now, i, p;
    32     queue<int> q;
    33     q.push(0);
    34     while (!q.empty()) {
    35         now = q.front();
    36         q.pop();
    37         for (i = 'A'; i <= 'Z'; i++) {
    38             if (tree[now].next[i]) {
    39                 p = tree[now].next[i];
    40                 if (now)
    41                     tree[p].fail = tree[tree[now].fail].next[i];
    42                 q.push(p);
    43             } else
    44                 tree[now].next[i] = tree[tree[now].fail].next[i];
    45         }
    46     }
    47 }
    48 void Match(char *s) {
    49     int now, t, p;
    50     for (now = 0; *s; s++) {
    51         t = *s;
    52         now = tree[now].next[t];
    53         for (p = now; p; p = tree[p].fail)
    54             cnt[tree[p].pos]++;
    55     }
    56 }
    57 int main() {
    58     int n, i;
    59     while (~scanf("%d", &n)) {
    60         tree[size = 0].Init();
    61         memset(cnt, 0, sizeof(cnt));
    62         for (i = 1; i <= n; i++) {
    63             scanf(" %s", dic[i]);
    64             Insert(dic[i], i);
    65         }
    66         BFS();
    67         scanf(" %s", str);
    68         Match(str);
    69         for (i = 1; i <= n; i++) {
    70             if (cnt[i])
    71                 printf("%s: %d\n", dic[i], cnt[i]);
    72         }
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    边缘检测
    图片融合
    毛玻璃
    图像添加马赛克
    图像颜色反转
    图像灰度处理
    图像仿射变换/旋转
    图像剪切/位移
    图像缩放/插值
    神经网络逼近股票价格
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2619129.html
Copyright © 2011-2022 走看看