简单版

题目链接:
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自动机(简单版/加强版)相关推荐

  1. 模板 - AC自动机

    ACM-ICPC模板 目录 求有多少个模式串在文本串里出现过 建fail树dfs求每个模式串在文本串中的出现次数 ac自动机fail树上dfs序建可持久化线段树 AC自动机是一种多模匹配算法 AC自动 ...

  2. POJ 1625 Censored!(AC自动机-指针版+DP+大数)题解

    题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...

  3. HDU 2222 ACAM模板(AC自动机)

    这里找到了两篇很nice的Trie树(作者Hackbuteer1)以及AC自动机(作者niushuai666)入门详解.博主写的可以说是非常用心了,一看就懂. 题意:给出N(<=10000)个单 ...

  4. AC自动机从入门到last优化

    AC自动机是KMP算法和Trie(字典树)的巧妙结合这篇文章主要讲针对几个例题给出解答模版(主要是知识点自己讲不清楚). 至于针对的知识点,给上几个我认为说的比较好的传送门,读者可以自行选择阅读.(我 ...

  5. 提高篇 第二部分 字符串算法 第4章 AC自动机

    https://blog.csdn.net/wangyh1008/article/details/81428056 [模板]AC自动机(加强版) 洛谷3796 AC自动机_A_loud_name-CS ...

  6. ac自动机 匹配最长前缀_AC自动机算法

    AC自动机简介: 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包 ...

  7. [C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ

    前言 做过杭电.浙大或是北大等ACM题库的人一定对"刷题"不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到"Onl ...

  8. luogu P3808 【模板】AC自动机(简单版)

    二次联通门 : luogu P3808 [模板]AC自动机(简单版) /*luogu P3808 [模板]AC自动机(简单版)手速越来越快了10分钟一个AC自动机一遍过编译 + 一边AC感觉不错我也就 ...

  9. 【模板】AC自动机(简单版)

    题目背景 通过套取数据而直接"打表"过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据 ...

最新文章

  1. zookeeper学习记录
  2. android studio 3.0新功能介绍
  3. 怎么在ReactNative里面使用Typescript
  4. loadrunner 配置远程监控windows服务器系统资源
  5. 分段线性变换与直方图修正
  6. JAVA——附加作业1——统计员工数
  7. Vue小案例 之 商品管理------创建页面与部分数据
  8. [洛谷P3292] [SCOI2016]幸运数字
  9. 如果常数项没有经过显著性检验_时间序列(一):平稳性、自相关函数与LB检验...
  10. VIM 下工程的管理工具
  11. 自学python考哪些证书-自学python找什么书?
  12. RHadoop的安装与试验
  13. Python操作微信群发消息检测僵尸粉
  14. 现身说法:37 岁老码农找工作
  15. iphone/ipad保存图片问题
  16. 别再乱提交代码了,看下大厂 Git 提交规范是怎么做的!
  17. ArcGIS软件CAD数据通过转换建立GIS数据库
  18. 信号满格怎么显示无法连接服务器,Win7 32系统网络信号满格却无法连接上网怎么处理...
  19. 实验6 Sniffer网络安全检测
  20. Spring IOC与DI、反射的理解 含小案例说明

热门文章

  1. client中周期性边界_「微评」增加艺术品在投资组合中的比例 推进国家艺术软实力...
  2. 在python中strip_python中strip()函数怎么用?
  3. 三菱四节传送带控制梯形图_一文讲透FX5U PLC程序控制指令及步进梯形图编程
  4. python数据抓取课程_Python爬虫入门教程 21-100 网易云课堂课程数据抓取
  5. c++随机数函数rand()
  6. win7 计算器 android,教你巧妙应用Win7计算器和时钟
  7. 367. 有效的完全平方数(二分法)
  8. 7-3 树的同构 (25 分)(思路加详解)来呀baby!!!!!!!!
  9. android 片段,android – 将片段添加到片段中(嵌套片段)
  10. linux ps mysql_linux系统中ps指令使用详解