P3808,P3796-[模板]AC自动机(简单版/加强版)
简单版
题目链接:
https://www.luogu.org/problem/P3808
题目大意
nnn个模式串,一个文本串,求有多少个模式串出现在文本串里。
解题思路
普通ACACAC自动机不解释。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e6+100;
int n,ans;
char s[N];
struct ACmac{int fail[N],son[N][30],siz[N],cnt;queue<int> q;void Make(char *s){int x=1,len=strlen(s);for(int i=0;i<len;i++){int c=s[i]-'a';if(!son[x][c]){son[x][c]=++cnt;memset(son[cnt],0,sizeof(son[cnt]));}x=son[x][c];}siz[x]++;return;}void Bfs(){for(int i=0;i<26;i++)son[0][i]=1;q.push(1);fail[1]=0;while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<26;i++){if(!son[x][i]) son[x][i]=son[fail[x]][i];else{q.push(son[x][i]);int y=fail[x];fail[son[x][i]]=son[y][i];}}}}void Find(char *s){int x=1,len=strlen(s);for(int i=0;i<len;i++){int c=s[i]-'a',k=son[x][c];while(k>1&&siz[k]){ans+=siz[k];siz[k]=0;k=fail[k];}x=son[x][c];}return;}
}Ac;
int main()
{scanf("%d",&n);Ac.cnt=1;for(int i=0;i<26;i++)Ac.son[0][i]=1,Ac.son[1][i]=0;for(int i=1;i<=n;i++){scanf("%s",s);Ac.Make(s);}Ac.Bfs();scanf("%s",s);Ac.Find(s);printf("%d\n",ans);
}
复杂版
题目链接:
https://www.luogu.org/problem/P3796
题目大意
nnn个模式串,一个文本串,求在文本串中出现次数最多的模式串并输出
解题思路
在末尾结点维护一个当前模式串的编号,然后匹配的时候将答案统计到那个编号里即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e6+100;
int n;
char s[160][90],S[N];
struct ansnode{int w,pos;
}ans[N];
struct ACmac{int fail[N],son[N][30],ed[N],cnt;queue<int> q;void Make(char *s,int num){int x=1,len=strlen(s);for(int i=0;i<len;i++){int c=s[i]-'a';if(!son[x][c]){son[x][c]=++cnt;memset(son[cnt],0,sizeof(son[cnt]));}x=son[x][c];}ed[x]=num;return;}void Bfs(){for(int i=0;i<26;i++)son[0][i]=1;q.push(1);fail[1]=0;while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<26;i++){if(!son[x][i]) son[x][i]=son[fail[x]][i];else{q.push(son[x][i]);int y=fail[x];fail[son[x][i]]=son[y][i];}}}}void Find(char *s){int x=1,len=strlen(s);for(int i=0;i<len;i++){int c=s[i]-'a',k=son[x][c];for(;k;k=fail[k])ans[ed[k]].w++;x=son[x][c];}return;}
}Ac;
bool cMp(ansnode x,ansnode y)
{return x.w==y.w?x.pos<y.pos:x.w>y.w;}
int main()
{while(1){scanf("%d",&n);if(!n) return 0;Ac.cnt=1;memset(Ac.son,0,sizeof(Ac.son));memset(Ac.fail,0,sizeof(Ac.fail));memset(Ac.ed,0,sizeof(Ac.ed));for(int i=0;i<26;i++)Ac.son[0][i]=1,Ac.son[1][i]=0;for(int i=1;i<=n;i++){scanf("%s",s[i]);ans[i].pos=i;ans[i].w=0;Ac.Make(s[i],i);}Ac.Bfs();scanf("%s",S);Ac.Find(S);sort(ans+1,ans+1+n,cMp);printf("%d\n%s\n",ans[1].w,s[ans[1].pos]);for(int i=2;i<=n;i++){if(ans[i].w==ans[i-1].w)printf("%s\n",s[ans[i].pos]);else break;}}
}
P3808,P3796-[模板]AC自动机(简单版/加强版)相关推荐
- 模板 - AC自动机
ACM-ICPC模板 目录 求有多少个模式串在文本串里出现过 建fail树dfs求每个模式串在文本串中的出现次数 ac自动机fail树上dfs序建可持久化线段树 AC自动机是一种多模匹配算法 AC自动 ...
- POJ 1625 Censored!(AC自动机-指针版+DP+大数)题解
题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...
- HDU 2222 ACAM模板(AC自动机)
这里找到了两篇很nice的Trie树(作者Hackbuteer1)以及AC自动机(作者niushuai666)入门详解.博主写的可以说是非常用心了,一看就懂. 题意:给出N(<=10000)个单 ...
- AC自动机从入门到last优化
AC自动机是KMP算法和Trie(字典树)的巧妙结合这篇文章主要讲针对几个例题给出解答模版(主要是知识点自己讲不清楚). 至于针对的知识点,给上几个我认为说的比较好的传送门,读者可以自行选择阅读.(我 ...
- 提高篇 第二部分 字符串算法 第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个单词,再给出一段包 ...
- [C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ
前言 做过杭电.浙大或是北大等ACM题库的人一定对"刷题"不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到"Onl ...
- luogu P3808 【模板】AC自动机(简单版)
二次联通门 : luogu P3808 [模板]AC自动机(简单版) /*luogu P3808 [模板]AC自动机(简单版)手速越来越快了10分钟一个AC自动机一遍过编译 + 一边AC感觉不错我也就 ...
- 【模板】AC自动机(简单版)
题目背景 通过套取数据而直接"打表"过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据 ...
最新文章
- zookeeper学习记录
- android studio 3.0新功能介绍
- 怎么在ReactNative里面使用Typescript
- loadrunner 配置远程监控windows服务器系统资源
- 分段线性变换与直方图修正
- JAVA——附加作业1——统计员工数
- Vue小案例 之 商品管理------创建页面与部分数据
- [洛谷P3292] [SCOI2016]幸运数字
- 如果常数项没有经过显著性检验_时间序列(一):平稳性、自相关函数与LB检验...
- VIM 下工程的管理工具
- 自学python考哪些证书-自学python找什么书?
- RHadoop的安装与试验
- Python操作微信群发消息检测僵尸粉
- 现身说法:37 岁老码农找工作
- iphone/ipad保存图片问题
- 别再乱提交代码了,看下大厂 Git 提交规范是怎么做的!
- ArcGIS软件CAD数据通过转换建立GIS数据库
- 信号满格怎么显示无法连接服务器,Win7 32系统网络信号满格却无法连接上网怎么处理...
- 实验6 Sniffer网络安全检测
- Spring IOC与DI、反射的理解 含小案例说明
热门文章
- client中周期性边界_「微评」增加艺术品在投资组合中的比例 推进国家艺术软实力...
- 在python中strip_python中strip()函数怎么用?
- 三菱四节传送带控制梯形图_一文讲透FX5U PLC程序控制指令及步进梯形图编程
- python数据抓取课程_Python爬虫入门教程 21-100 网易云课堂课程数据抓取
- c++随机数函数rand()
- win7 计算器 android,教你巧妙应用Win7计算器和时钟
- 367. 有效的完全平方数(二分法)
- 7-3 树的同构 (25 分)(思路加详解)来呀baby!!!!!!!!
- android 片段,android – 将片段添加到片段中(嵌套片段)
- linux ps mysql_linux系统中ps指令使用详解