zoukankan      html  css  js  c++  java
  • [HDOJ5384]Danganronpa

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384

    字典树过,把子弹存入树内,再穷举每一个怪物的子串,看看子串是否在树内存在。

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <cctype>
     8 #include <queue>
     9 #include <map>
    10 #include <set>
    11 #include <stack>
    12 #include <list>
    13 #include <vector>
    14 
    15 using namespace std;
    16 
    17 const int maxn = 100010;
    18 int n, m;
    19 string a[maxn];
    20 char b[maxn];
    21 
    22 typedef struct Node {
    23     Node *next[26];
    24     int cnt;
    25     Node() {
    26         cnt = 0;
    27         for(int i = 0; i < 26; i++) {
    28             next[i] = NULL;
    29         }
    30     }
    31 }Node;
    32 
    33 void insert(Node *p, char *str) {
    34     for(int i = 0; str[i]; i++) {
    35         int t = str[i] - 'a';
    36         if(p->next[t] == NULL) {
    37             p->next[t] = new Node();
    38         }
    39         p = p->next[t];
    40     }
    41     p->cnt++;
    42 }
    43 
    44 int find(Node *p, string str) {
    45     int res = 0;
    46     for(int i = 0; str[i]; i++) {
    47         int t = str[i] - 'a';
    48         if(p->next[t]) {
    49             p = p->next[t];
    50         }
    51         else {
    52             break;
    53         }
    54         res += p->cnt;
    55     }
    56     return res;
    57 }
    58 
    59 void tfree(Node *root) {
    60     for(int i = 0; i < 26; i++) {
    61         if(root->next[i] != NULL) {
    62             tfree(root->next[i]);
    63         }
    64     }
    65     delete root;
    66 }
    67 
    68 int solve(Node* root) {
    69     for(int i = 0; i < n; i++) {
    70         int ans = 0;
    71         for(int j = 0; j < a[i].size(); j++) {
    72             ans += find(root, a[i].substr(j));
    73         }
    74         printf("%d
    ", ans);
    75     }
    76 }
    77 
    78 int main() {
    79     // freopen("in", "r", stdin);
    80     int T;
    81     scanf("%d", &T);
    82     while(T--) {
    83         Node *root = new Node();
    84         scanf("%d %d", &n, &m);
    85         for(int i = 0; i < n; i++) {
    86             cin >> a[i];
    87         }
    88         for(int i = 0; i < m; i++) {
    89             scanf("%s", b);
    90             insert(root, b);
    91         }
    92         solve(root);
    93         tfree(root);
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    redhat 6.4重新安装python和yum
    【机器学习】置信区间上界算法UCB(Upper Confidence Bound)
    MAC终端zsh配置
    [Android] 重新打包(替换)签名APK
    UNI-APP常用方法
    一个请求的生命周期
    jquery追加元素的几种方法?(包括append()、prepend()、after()、before()、insertAfter()、insertBefore())
    怎样查外键建在哪个表上
    Redis实现分布式锁
    sql语句中对单个字段去重,distinct和group by性能分析
  • 原文地址:https://www.cnblogs.com/kirai/p/4782937.html
Copyright © 2011-2022 走看看