题目传送门

  1. /*
  2. 题意:多个文本串,多个模式串在每个文本串出现的次数
  3. AC自动机:这就是一道模板题,杭电有道类似的题目
  4. */
  5. /************************************************
  6. * Author :Running_Time
  7. * Created Time :2015-8-14 14:14:32
  8. * File Name :AC.cpp
  9. ************************************************/
  10. #include <cstdio>
  11. #include <algorithm>
  12. #include <iostream>
  13. #include <sstream>
  14. #include <cstring>
  15. #include <cmath>
  16. #include <string>
  17. #include <vector>
  18. #include <queue>
  19. #include <deque>
  20. #include <stack>
  21. #include <list>
  22. #include <map>
  23. #include <set>
  24. #include <bitset>
  25. #include <cstdlib>
  26. #include <ctime>
  27. using namespace std;
  28. #define lson l, mid, rt << 1
  29. #define rson mid + 1, r, rt << 1 | 1
  30. typedef long long ll;
  31. const int MAXN = 1e5 + ;
  32. const int MAXNODE = 6e5 + ;
  33. const int INF = 0x3f3f3f3f;
  34. const int SIGMA_SIZE = ;
  35. const int MOD = 1e9 + ;
  36. ll res;
  37. struct AC {
  38. int ch[MAXNODE][SIGMA_SIZE], f[MAXNODE], sz;
  39. ll val[MAXNODE];
  40. void init(void) {
  41. memset (ch[], , sizeof (ch[]));
  42. sz = ; val[] = ;
  43. }
  44. int idx(char c) {
  45. return c - 'a';
  46. }
  47. void insert(string s) {
  48. int u = ; int len = s.size ();
  49. for (int i=; i<len; ++i) {
  50. int c = idx (s[i]);
  51. if (!ch[u][c]) {
  52. memset (ch[sz], , sizeof (ch[sz]));
  53. val[sz] = ;
  54. ch[u][c] = sz++;
  55. }
  56. u = ch[u][c];
  57. }
  58. val[u]++;
  59. }
  60. void build(void) {
  61. queue<int> Q; f[] = ;
  62. for (int i=; i<SIGMA_SIZE; ++i) {
  63. int u = ch[][i];
  64. if (u) {
  65. f[u] = ; Q.push (u);
  66. }
  67. }
  68. while (!Q.empty ()) {
  69. int r = Q.front (); Q.pop ();
  70. for (int i=; i<SIGMA_SIZE; ++i) {
  71. int u = ch[r][i];
  72. if (!u) {
  73. ch[r][i] = ch[f[r]][i]; continue;
  74. }
  75. Q.push (u);
  76. f[u] = ch[f[r]][i];
  77. val[u] += val[f[u]];
  78. }
  79. }
  80. }
  81. ll query(string s) {
  82. int len = s.size ();
  83. ll ret = ; int j = ;
  84. for (int i=; i<len; ++i) {
  85. int c = idx (s[i]);
  86. j = ch[j][c];
  87. ret += val[j];
  88. }
  89. return ret;
  90. }
  91. }ac;
  92. string t[MAXN], p;
  93. int main(void) { //HDOJ 5384 Danganronpa
  94. int T; scanf ("%d", &T);
  95. while (T--) {
  96. int n, m; scanf ("%d%d", &n, &m);
  97. ac.init ();
  98. for (int i=; i<=n; ++i) cin >> t[i];
  99. for (int i=; i<=m; ++i) {
  100. cin >> p; ac.insert (p);
  101. }
  102. ac.build ();
  103. for (int i=; i<=n; ++i) {
  104. printf ("%I64d\n", ac.query (t[i]));
  105. }
  106. }
  107. return ;
  108. }

AC自动机 HDOJ 5384 Danganronpa的更多相关文章

  1. HDOJ 5384 Danganronpa AC自己主动机

     AC自己主动机裸题 Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java ...

  2. AC自动机 HDOJ 2222 Keywords Search

    题目链接 题意:每个文本串的出现次数 分析:入门题,注意重复的关键字算不同的关键字,还有之前加过的清零.   新模板,加上last跑快一倍 #include <bits/stdc++.h> ...

  3. Hdu 5384 Danganronpa (AC自动机模板)

    题目链接: Hdu 5384 Danganronpa 题目描述: 给出n个目标串Ai,m个模式串Bj,问每个目标串中m个模式串出现的次数总和为多少? 解题思路: 与Hdu 2222  Keywords ...

  4. HDU 5384——Danganronpa——————【AC自动机】

    Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  5. 【HDOJ 5384】Danganronpa

    [HDOJ 5384]Danganronpa AC自己主动机. .. 当时感觉用字典树 标神也往自己主动机想来着..手太生加上时间紧迫也没敲--回来一看题解什么AB同一时候建自己主动机...顿时愣了 ...

  6. HDU 5384 AC自动机

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和. 分析:之前并不知道AC ...

  7. HDU 5384 字典树、AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...

  8. AC自动机+DP HDOJ 2457 DNA repair(DNA修复)

    题目链接 题意: 给n串有疾病的DNA序列,现有一串DNA序列,问最少修改几个DNA,能使新的DNA序列不含有疾病的DNA序列. 思路: 构建AC自动机,设定end结点,dp[i][j]表示长度i的前 ...

  9. hdoj 3065 病毒侵袭持续中(AC自动机)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 思路分析:问题需要模式匹配多个模式串,需要注意的是模式串会包含和重叠,需要对AC自动机的匹配过 ...

随机推荐

  1. 【转】nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

    原文: http://blog.csdn.net/pcyph/article/details/46513521 -------------------------------------------- ...

  2. hdu 3549 Flow Problem(最大流模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Problem Description Network flow is a well-known ...

  3. unix时间戳(unix timestamp)与北京时间的互转方法

    1.在linux bash下北京时间与unix时间戳互转: 获取unix timestamp: 命令:date "+%s" 输出:1372654714 获取北京时间: 命令:dat ...

  4. Selenium系列之--04 常见元素操作总结

    一.Selenium总共有八种定位方法  By.id()  通过id定位 By.name()  通过name 定位 By.xpath() 通过xpath定位 By.className() 通过clas ...

  5. Linux下kill命令的学习,(主要根据man手册进行的翻译)

    名字      kill -终止一个进程 格式     kill  [-s signal | -p]  [--] pid ..                                      ...

  6. 【知识梳理1】Android触摸事件机制

    前言 随着科学技术的发展,智能手机早已成为我们当代人身边不可缺少的"伙伴"之中的一个,堪比对象女友.每天我们对着手机反复的做着点击.滑动操作,而手机则随着我们的操作给我们展示她的精 ...

  7. STL vector的介绍(1)

    尝试下翻译STL里面的一些easy和算法.四级过了.六级刚考.顺便练练自己的英语水平.翻译的不好的地方请大神多多不吝赐教哈.方便我改正. 原来均来自:http://www.cplusplus.com/ ...

  8. C语言-- static 全局使用示例

    C语言-- static 全局使用示例  前言:看到很多使用Objective-C开发IOS的大牛,有时候会使用static全局变量,相比之下,我却很少用这个,从而很少对其有着比较有实质意义的理解,甚 ...

  9. Android不刷机下的app2sd方法(dex cache占空间解决篇)

    抱着5年的HTC G7这个古董,一直没有想法去换换. 近期微信.支付宝什么的apk应用都開始走程序巨型化,一次性就来个50MB的空间占用,让还是Android 2.2的手机怎样吃的消? 看看100多M ...

  10. The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF

    打开表单偶尔会出现这个提示,解决方法: web.config增加配置: <configuration> <system.net> <settings> <ht ...