P3796 【模板】AC自动机
AC自动机的模板
简单的理解就是字典树上的KMP
注意数组不要开太大
不然每次memset耗时太多
有一个小优化
每次走 fail 边找匹配时只有一些会更新答案
那么就可以把没用的fail边压缩掉
设 g[x] 表示从 x 点一直走 fail 边,走到的第一个有结束标记的点
那么找匹配时就只有要 g 边
然后就是模板了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int N=5e4+;
int len,n;
char s[];
inline void read_s()//文本串比较大,可以用快读加速
{
char ch=getchar(); len=;
while(ch<'a'||ch>'z') ch=getchar();
while(ch>='a'&&ch<='z')
{
s[++len]=ch;
ch=getchar();
}
}
int c[N][],pd[N],fail[N],g[N],cnt;
char a[][]; int l[];
inline void clr()//清空AC自动机
{
memset(c,,sizeof(c));
memset(pd,,sizeof(pd));
memset(fail,,sizeof(fail));
memset(g,,sizeof(g));
cnt=;
}
inline void ins(int num)//插入单词到自动机(跟字典树没区别)
{
int u=;
for(int i=;i<l[num];i++)
{
int v=a[num][i]-'a'+;
if(!c[u][v]) c[u][v]=++cnt;
u=c[u][v];
}
pd[u]=num;
}
queue <int> q;
inline void pre()//预处理fail和g
{
for(int i=;i<=;i++)
if(c[][i]) q.push(c[][i]);
while(!q.empty())
{
int u=q.front(); q.pop();
for(int i=;i<=;i++)
{
int v=c[u][i];
if(!v) c[u][i]=c[fail[u]][i];//失配了直接走失配边
else
{
fail[v]=c[fail[u]][i];
g[v]= pd[fail[v]] ? fail[v] : g[fail[v]];//处理g
q.push(v);
}
}
}
}
int mx,ans[];
inline void query()//AC自动机匹配(好像跟字典树也没什么区别)
{
memset(ans,,sizeof(ans));
int u=;
for(int i=;i<=len;i++)
{
u=c[u][s[i]-'a'+];
if(pd[u]) ans[pd[u]]++;
for(int j=g[u];j;j=g[j])
ans[pd[j]]++;
//计算匹配
}
mx=;
for(int i=;i<=n;i++)
mx=max(mx,ans[i]);
cout<<mx<<endl;
for(int i=;i<=n;i++)
if(ans[i]==mx)
printf("%s\n",a[i]);
}
int main()
{
while()
{
scanf("%d",&n); if(!n) break;
clr();
for(int i=;i<=n;i++)
{
scanf("%s",a[i]);
l[i]=strlen(a[i]);
ins(i);
}
pre();
read_s();
query();
}
return ;
}
P3796 【模板】AC自动机的更多相关文章
- luoguP3808[模板]AC自动机(简单版)
传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...
- luoguP3796[模板]AC自动机(加强版)
传送门 ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: #include<cstdio> #include<iostream> # ...
- 算法模板——AC自动机
实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...
- 模板 AC自动机
题目描述 有$N$ 个由小写字母组成的模式串以及一个文本串$T$ .每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串$T$ 中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据 ...
- 算法竞赛模板 AC自动机
AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...
- 洛谷.3808/3796.[模板]AC自动机
题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...
- 模板—AC自动机
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct ...
- 模板——AC自动机
传送门:QAQQAQ 定义nxt[u]=v表示从u开始不断沿着失配边跳到的第一个是标记点的端点v,那么我们再匹配时沿着last跳,每跳到一个last,它就一定对应一个模式串,所以效率是非常高的. 和K ...
- AC自动机例题
P3808 [模板]AC自动机(简单版) [题目描述] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. #include<bits/stdc++.h> using name ...
- 「kuangbin带你飞」专题十七 AC自动机
layout: post title: 「kuangbin带你飞」专题十七 AC自动机 author: "luowentaoaa" catalog: true tags: - ku ...
随机推荐
- Hadoop YARN: 1/1 local-dirs are bad: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers hdfs硬盘90% yarn unhealthy
1/1 local-dirs are bad: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir; 1/1 log-dirs are bad: /var/log ...
- elmah数据库sql脚本
/* 错误管理工具 SQL代码 */CREATE TABLE dbo.ELMAH_Error( ErrorId UNIQUEIDENTIFIER NOT NULL, Application NVARC ...
- Swing事件机制
-------------siwuxie095 Swing 是基于 MVC 结构的框架 在 Swing 中,所有的用户操作都是基于 Co ...
- Python 网络爬虫 008 (编程) 通过ID索引号遍历目标网页里链接的所有网页
通过 ID索引号 遍历目标网页里链接的所有网页 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyChar ...
- 数字图像处理实验(1):PROJECT 02-01, Image Printing Program Based on Halftoning 标签: 图像处理MATLAB 2017-04-2
实验要求: Image Printing Program Based on Halftoning Objective: To know in principle what is "halft ...
- ZROI2018普转提day7t1
传送门 分析 一道有意思的小题... 我们发现如果$(1,1)$为白色,则将其变为白色需要偶数次操作,而如果为黑色则需要奇数次操作 我们知道要让A赢需要奇数次操作,所以我们只需要判断$(1,1)$的颜 ...
- ZROI2018普转提day2t3
传送门 分析 考试的时候sb了......我们发现可以按照先序遍历将一棵树变成一个序列,而不需要删的数的数量便是最长上升子序列的长度,但是还有一个问题就是如果在5和7之间有3个空的位置就无法填入合法的 ...
- can基础知识介绍
1.什么是can 2.can的特点 2.物理层特征 我们使用ISO11898标准,物理层特征如图所示 3.帧的种类介绍 实际上有一些帧是有硬件来实现的. 4.数据帧介绍 5.总线仲裁 6.位时序(用于 ...
- CSS+DIV网页样式布局实战从入门到精通 中文pdf扫描版
CSS+DIV网页样式布局实战从入门到精通通过精选案例引导读者深入学习,系统地介绍了利用CSS和DIV进行网页样式布局的相关知识和操作方法. 全书共21章.第1-5章主要介绍网页样式布局的基础知识,包 ...
- 国内物联网平台(1):百度物接入IoT Hub
国内物联网平台(1) ——百度物接入IoT Hub 马智 物接入IoT Hub - 架构 全托管的云服务,帮助建立设备与云端之间安全可靠的双向连接 支撑海量设备的数据收集.监控.故障预测等各种物联网场 ...