luogu P3796【模板】AC自动机(加强版)
嘟嘟嘟
这个和某谷的AC自动机模板简单版差不多。
但还是要注意几点的:
1.这个是统计出现次数,而不是是否出现,所以在查询的时候加上这个节点的val后,不能把val标记为-1。那么也就可以说查询的时间复杂度能比简单版的稍微第一慢一点。
2.考虑k个一样的模式串:刚开始我想的是每一个节点开一个vector,记录这里是第几个模式串。但其实没有这个必要,对于相同的模式串,我们只用记录任意一个就行,反而在出现次数上要都加上。因为如果主串中存在这些相同的模式串,那么出现次数应该是出现次数 * k。输出的时候如果是这些串最多,那么都应该把这些输出。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cctype> 8 #include<stack> 9 #include<queue> 10 #include<vector> 11 using namespace std; 12 #define enter puts("") 13 #define space putchar(' ') 14 #define Mem(a, x) memset(a, x, sizeof(a)) 15 #define rg register 16 typedef long long ll; 17 typedef double db; 18 const int INF = 0x3f3f3f3f; 19 const db eps = 1e-8; 20 const int maxn = 1e6 + 5; 21 const int maxm = 1.05e4 + 5; 22 inline ll read() 23 { 24 ll ans = 0; 25 char ch = getchar(), las = ' '; 26 while(!isdigit(ch)) las = ch, ch = getchar(); 27 while(isdigit(ch)) ans = ans * 10 + ch - '0', ch = getchar(); 28 if(las == '-') ans = -ans; 29 return ans; 30 } 31 inline void write(ll x) 32 { 33 if(x < 0) putchar('-'), x = -x; 34 if(x >= 10) write(x / 10); 35 putchar(x % 10 + '0'); 36 } 37 38 int n; 39 char s[maxn], ss[155][75]; 40 41 int sum[155]; 42 int ch[maxm][26], val[maxm], pos[maxm], f[maxm], cnt = 0; 43 int getnum(char c) 44 { 45 return c - 'a'; 46 } 47 void insert(int id, char *s) 48 { 49 int m = strlen(s); 50 int now = 0; 51 for(int i = 0; i < m; ++i) 52 { 53 int c = getnum(s[i]); 54 if(!ch[now][c]) ch[now][c] = ++cnt; 55 now = ch[now][c]; 56 } 57 val[now]++; pos[now] = id; 58 } 59 void build() 60 { 61 queue<int> q; 62 for(int i = 0; i < 26; ++i) if(ch[0][i]) q.push(ch[0][i]); 63 while(!q.empty()) 64 { 65 int now = q.front(); q.pop(); 66 for(int i = 0; i < 26; ++i) 67 { 68 if(ch[now][i]) f[ch[now][i]] = ch[f[now]][i], q.push(ch[now][i]); 69 else ch[now][i] = ch[f[now]][i]; 70 } 71 } 72 } 73 void query(char *s) 74 { 75 int m = strlen(s), now = 0; 76 for(int i = 0; i < m; ++i) 77 { 78 int c = getnum(s[i]); 79 now = ch[now][c]; 80 for(int j = now; j; j = f[j]) sum[pos[j]] += val[j]; 81 } 82 } 83 84 void init() 85 { 86 Mem(ch, 0); Mem(val, 0); Mem(pos, 0); Mem(f, 0); 87 Mem(sum, 0); 88 cnt = 0; 89 } 90 91 int main() 92 { 93 while(scanf("%d", &n) && n) 94 { 95 init(); 96 for(int i = 1; i <= n; ++i) 97 { 98 scanf("%s", ss[i]); 99 insert(i, ss[i]); 100 } 101 build(); 102 scanf("%s", s); 103 query(s); 104 int Max = -1; 105 for(int i = 1; i <= n; ++i) Max = max(Max, sum[i]); 106 write(Max); enter; 107 for(int i = 1; i <= n; ++i) if(sum[i] == Max) printf("%s\n", ss[i]); 108 } 109 return 0; 110 }
View Code
转载于:https://www.cnblogs.com/mrclr/p/9768532.html
luogu P3796【模板】AC自动机(加强版)相关推荐
- 【AC自动机】单词(luogu 3966/ybtoj AC自动机-2)
正题 luogu 3966 ybtoj AC自动机-2 题目大意 给你n个单词,让你查询这写单词分别在这n个单词中出现过多少次 解题思路 先用AC自动机建好图,然后每个点的权值为1,然后向nx传递 代 ...
- 模板 - AC自动机
ACM-ICPC模板 目录 求有多少个模式串在文本串里出现过 建fail树dfs求每个模式串在文本串中的出现次数 ac自动机fail树上dfs序建可持久化线段树 AC自动机是一种多模匹配算法 AC自动 ...
- HDU 2222 ACAM模板(AC自动机)
这里找到了两篇很nice的Trie树(作者Hackbuteer1)以及AC自动机(作者niushuai666)入门详解.博主写的可以说是非常用心了,一看就懂. 题意:给出N(<=10000)个单 ...
- AC自动机加强版 uva 1449 - Dominating Patterns
AC自动机最初作用 一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过. 当然这不是AC自动机的全部作用. 本文就是一例,给出几个单词,查询在text里 ...
- AC自动机模板(【CJOJ1435】)
题面 Description 对,这就是裸的AC自动机. 要求:在规定时间内统计出模版字符串在文本中出现的次数. Input 第一行:模版字符串的个数N. 第2->N+1行:N个字符串.(每个模 ...
- AC自动机讲解超详细
begin:2019/5/2 update 2020/6/12 更新了LaTeX(咕了好久 感谢大家支持! AC自动机详细讲解 AC自动机真是个好东西!之前学KMPKMPKMP被NextNextNex ...
- 提高篇 第二部分 字符串算法 第4章 AC自动机
https://blog.csdn.net/wangyh1008/article/details/81428056 [模板]AC自动机(加强版) 洛谷3796 AC自动机_A_loud_name-CS ...
- ac自动机 匹配最长前缀_AC自动机算法
AC自动机简介: 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包 ...
- P3796 【模板】AC自动机(加强版)
P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串 ...
最新文章
- idea查看ruby代码_Ruby实现命令行中查看函数源码的方法
- 考前自学系列·计算机组成原理·查询方式/中断方式/DMA方式的适用范围及判断
- 设计模式-观察者模式(Observer)
- Mybatis:基于注解形式,传入List,返回List实体
- Backbone - create model
- Windows下的常用的DOS命令
- web.xml 组件加载顺序
- 如何提高生产力(二)、软件的开发与采购
- python 获取文件夹所有文件列表_python获取文件夹下所有文件及os模块方法
- fiddler无法抓取浏览器的https请求
- Win10 Composer下载安装
- 全球及中国晶圆锯划片刀行业发展态势及投资潜力预测报告2021-2027年
- Python 简易图形用户界面计算器
- ETF操作实战记录:2022-2-24
- ② 判断语句、循环语句
- java RSA生成公钥对象和私钥对象
- 使用TensorFlow识别交通标志
- 毕业五年,终于上车了
- 驱动级的特征码修改——终级免杀之PcShare
- mp3怎么转换成mp4?
热门文章
- JavaScript深入理解对象方法——Object.assign()
- html文本超出自动换行、显示省略号
- 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...
- 什么是关键字驱动框架(自动化测试)
- Dao层系列-4-Hibernate Spring Annotation
- 机器学习笔记(五)神经网络
- Pandas转pivot, groupby等结果为dataFrame--彻底解决多表头问题
- Android异步加载
- python圆的周长和面积返回2个值的元组_初见Python2:列表和元组
- vue动态绑定class,tab切换非常好用