题目传送门

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

转载于:https://www.cnblogs.com/Running-Time/p/4737710.html

AC自动机 HDOJ 5384 Danganronpa相关推荐

  1. AC自动机 HDOJ 2222 Keywords Search

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

  2. 【HDOJ 5384】Danganronpa

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

  3. HDOJ 2896 病毒侵袭(AC自动机入门)

    题意: 求感染病毒的网站,并输出其感染的病毒特征码编号. 思路: AC自动机入门,思路同 HDOJ 2222 #include <iostream> #include <deque& ...

  4. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

  5. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  6. AC自动机算法及模板

    AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报  分类: AC自动机(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...

  7. Keywords Search AC自动机QAQ

    AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...

  8. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  9. 【Luogu3041】视频游戏的连击(AC自动机,动态规划)

    题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...

最新文章

  1. 2018java二级考试大纲_2018年全国计算机二级java考试简答题练习二
  2. C++编程进阶9(如何将构造函数和非成员函数虚化、无锁单例模式)
  3. 数据结构(数据库)设计规范
  4. 关于inline函数
  5. jpa mysql sql分页查询语句_JPA多条件复杂SQL动态分页查询功能
  6. 用WSDL定义Web服务
  7. OpenGL - Normal Map
  8. Silverlight初级教程系列
  9. 安卓Queue的使用
  10. ICEM特别卡顿,NVIDIA英伟达显卡问题,将集成处理器改成高性能即可【终极解决方案】
  11. 页面加载速度优化的建议
  12. zend studio 本地调试php,Zend Studio调试php教程
  13. Docker部署程序员简历
  14. Unity太空大战游戏-Socket网络通信教学示例
  15. 【读书笔记】C#—文件IO入门
  16. prusai3打印机使用教程_【打印虎原创】Prusa_i3_3D打印机校准图解教程-基础篇
  17. Docker学习(二)进阶
  18. 计算机网络基础北邮,北邮 大三下 计算机网络技术实践 实验五_图文
  19. matlab的gui界面怎么用,MATLAB的GUI界面基础操作
  20. 微信发红包功能的实现

热门文章

  1. 没有匹配 if 的非法 else_求求你,别再写这么多if...else...了
  2. 非线性振动 matlab,用MATLAB分析非线性弹簧振子的振动
  3. python加密库用哪个好_Python的加密库入门!
  4. obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别
  5. vb mysql 查询_vb中用sql语句查询数据库
  6. elment-ui 表格进行实时百分比计算
  7. 记录一下vlfeat视觉库配置
  8. java return用法_Java枚举的高级用法之多键值的映射使用
  9. lt li gt html,lt;ligt;...这个符号什么意思,放在中间有什么作用?
  10. pta l2-7(家庭房产)