[hdu2222]Keywords Search(AC自动机)
题意:给定n个单词,一个字符串,问字符串中出现了多少个单词。
解题关键:AC自动机模板题,注意根据题意,匹配完成之后要置0.
注意char数组也可以用cin,
注意理解AC自动机,不可能在同一层 出现两个相同的前缀,不然会合并在一起的,所以一定会分层,所以可以依靠fail指针递归寻找。
AC自动机最重要的地方在于 用后缀来匹配前缀
复杂度:$O(NS + T)$
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=26; 5 const int MAXN=520000; 6 struct Trie{//数组形式 7 int Next[MAXN][N],Fail[MAXN],End[MAXN],root,tot;//大小为所以匹配字符串的总和 8 int newnode(){//结构体内部用 9 for(int i=0;i<N;i++) Next[tot][i]=-1; 10 End[tot++]=0; 11 return tot-1; 12 } 13 void init(){ 14 tot=0; 15 root=newnode(); 16 } 17 void insert(char buf[]){ 18 int len=strlen(buf); 19 int now=root;//now是temp指针 20 for(int i=0;i<len;i++){ 21 int k=buf[i]-'a'; 22 if(Next[now][k]==-1) Next[now][k]=newnode();//next数组代表的是下一个字符索引 23 now=Next[now][k]; 24 } 25 End[now]++;//end数组是当前字符串的个数.字典中可能有相同的单词,若只算一次,改为1. 26 } 27 void build(){//构造fail指针,后缀是某些前缀 28 queue<int>que; 29 Fail[root]=root; 30 for(int i=0;i<N;i++){ 31 if(Next[root][i]==-1) Next[root][i]=root; 32 else{ 33 Fail[Next[root][i]]=root; 34 que.push(Next[root][i]); 35 } 36 } 37 while(!que.empty()){//bfs,会将所有的匹配子串都遍历到 38 int now=que.front(); 39 que.pop(); 40 for(int i=0;i<N;i++){ 41 if(Next[now][i]==-1) Next[now][i]=Next[Fail[now]][i]; 42 else{ 43 Fail[Next[now][i]]=Next[Fail[now]][i]; 44 que.push(Next[now][i]); 45 } 46 } 47 } 48 } 49 int query(char buf[]){ 50 int len=strlen(buf),now=root,res=0; 51 for(int i=0;i<len;i++){ 52 now=Next[now][buf[i]-'a']; 53 int temp=now; 54 while(temp!=root){ 55 res+=End[temp]; 56 End[temp]=0;//模式串只在主串中匹配一次就可以了,若匹配次数算作n次,次数不必置0 57 temp=Fail[temp]; 58 } 59 } 60 return res; 61 } 62 }; 63 Trie ac; 64 char buf[1000003]; 65 int main(){ 66 int T,n; 67 ios::sync_with_stdio(0); 68 cin>>T; 69 while(T--){ 70 ac.init(); 71 cin>>n; 72 for(int i=0;i<n;i++){ 73 cin>>buf; 74 ac.insert(buf); 75 } 76 ac.build();//不要忘记build 77 cin>>buf; 78 int ans=ac.query(buf); 79 cout<<ans<<"\n"; 80 } 81 return 0; 82 }
转载于:https://www.cnblogs.com/elpsycongroo/p/7503090.html
[hdu2222]Keywords Search(AC自动机)相关推荐
- HDU 2222 Keywords Search (AC自动机模板题)
一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...
- Keywords Search AC自动机QAQ
AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...
- HDU - 2222 Keywords Search(AC自动机)
题目链接:点击查看 题目大意:给出n个长度不超过50的模式串,再给出一个长度不超过1e6的主串,问模式串在主串中出现过多少次 题目分析:一开始我以为是求n次KMP,后来才知道这样做的时间复杂度是O(L ...
- hdu 2222 Keywords Search AC自动机——多串匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...
- HDU2222 Keywords Search
题目链接:HDU2222 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- HDU2222 Keywords Search(AC自动机模板)
AC自动机是一种多模式匹配的算法.大概过程如下: 首先所有模式串构造一棵Trie树,Trie树上的每个非根结点都代表一个从根出发到该点路径的字符串. 然后每个结点都计算出其fail指针的值,这个fai ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HUD2222 Keywords Serch AC自动机
传送门 显然这是一道AC自动机的模板题 但是还有一些地方需要注意: 1.多组数据要每次清空数组 2.关键字重复要累加,但是文本重复不能累加,可以打标记解决 #include<cstdio> ...
- hdu2222 Keywords Search(ACAM)
模板题. #include <cstdio> #include <cstring> #include <algorithm> #include <queue& ...
最新文章
- 一天一算法:快速排序
- 摘录cocos2d-x 从环境搭建到win32项目移植android平台
- 基于情感脑电信号时-频-空特征的3D密集连接网络
- 01 c++常见面试题总结
- Equipment download - No data contained in BDoc
- WindowsAPI-Findwindow函数和FindWindowEx用法
- 细数那些你可能不知道的国产数据库
- 两篇讲述Skinned Mesh原理的文章
- 【Java】JSON数据交换格式及其使用案例(聊天工具)
- 蓝桥集训之BFS、DFS和链式前向星
- js 图片浏览插件原生
- SEO助手-免费万能SEO网站优化小助手
- Navicat无法导入excel文件的异常处理
- 正则表达式小Tips
- 消息中间件MQ与RabbitMQ
- 补充设定 timer1 定时器和 timer2 定时器定时做多件事
- 汇集了很多swift 学习指南
- 渲染是不是很费电脑,云渲染对电脑的要求高吗?
- 海尔消费金融“增收不增利”:利润不及两年前,曾多次被点名批评
- 程序猿的自救 从零备考NSCA/CSCS 2 阻力运动生物力学