AC自动机 HDOJ 5384 Danganronpa
题目传送门
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相关推荐
- AC自动机 HDOJ 2222 Keywords Search
题目链接 题意:每个文本串的出现次数 分析:入门题,注意重复的关键字算不同的关键字,还有之前加过的清零. 新模板,加上last跑快一倍 #include <bits/stdc++.h> ...
- 【HDOJ 5384】Danganronpa
[HDOJ 5384]Danganronpa AC自己主动机. .. 当时感觉用字典树 标神也往自己主动机想来着..手太生加上时间紧迫也没敲--回来一看题解什么AB同一时候建自己主动机...顿时愣了 ...
- HDOJ 2896 病毒侵袭(AC自动机入门)
题意: 求感染病毒的网站,并输出其感染的病毒特征码编号. 思路: AC自动机入门,思路同 HDOJ 2222 #include <iostream> #include <deque& ...
- Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现
多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- AC自动机算法及模板
AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报 分类: AC自动机(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...
- Keywords Search AC自动机QAQ
AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...
- 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...
- 【Luogu3041】视频游戏的连击(AC自动机,动态规划)
题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...
最新文章
- 2018java二级考试大纲_2018年全国计算机二级java考试简答题练习二
- C++编程进阶9(如何将构造函数和非成员函数虚化、无锁单例模式)
- 数据结构(数据库)设计规范
- 关于inline函数
- jpa mysql sql分页查询语句_JPA多条件复杂SQL动态分页查询功能
- 用WSDL定义Web服务
- OpenGL - Normal Map
- Silverlight初级教程系列
- 安卓Queue的使用
- ICEM特别卡顿,NVIDIA英伟达显卡问题,将集成处理器改成高性能即可【终极解决方案】
- 页面加载速度优化的建议
- zend studio 本地调试php,Zend Studio调试php教程
- Docker部署程序员简历
- Unity太空大战游戏-Socket网络通信教学示例
- 【读书笔记】C#—文件IO入门
- prusai3打印机使用教程_【打印虎原创】Prusa_i3_3D打印机校准图解教程-基础篇
- Docker学习(二)进阶
- 计算机网络基础北邮,北邮 大三下 计算机网络技术实践 实验五_图文
- matlab的gui界面怎么用,MATLAB的GUI界面基础操作
- 微信发红包功能的实现
热门文章
- 没有匹配 if 的非法 else_求求你,别再写这么多if...else...了
- 非线性振动 matlab,用MATLAB分析非线性弹簧振子的振动
- python加密库用哪个好_Python的加密库入门!
- obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别
- vb mysql 查询_vb中用sql语句查询数据库
- elment-ui 表格进行实时百分比计算
- 记录一下vlfeat视觉库配置
- java return用法_Java枚举的高级用法之多键值的映射使用
- lt li gt html,lt;ligt;...这个符号什么意思,放在中间有什么作用?
- pta l2-7(家庭房产)