luoguP3796[模板]AC自动机(加强版)
传送门
ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢
暴力跳fail统计
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
const int maxn=1e6+10;queue<int>q;
int ed[151],fail[maxn],n,rt=1,id=1,ch[maxn][26],ans,vis[maxn],w[151];char s[151][maxn],ss[maxn];
void insert(char *s,int d)
{
w[d]=strlen(s+1);rt=1;
for(rg int i=1;i<=w[d];i++)
{
int now=s[i]-'a';
if(!ch[rt][now])ch[rt][now]=++id;
rt=ch[rt][now];
}
ed[d]=rt;
}
void bfs()
{
q.push(1);
while(!q.empty())
{
int x=q.front();q.pop();
for(rg int i=0;i<26;i++)
{
if(!ch[x][i]){ch[x][i]=fail[x]?ch[fail[x]][i]:1;continue;}
int j=fail[x],z=ch[x][i];q.push(z);
while(j&&!ch[j][i])j=fail[j];
if(j)fail[z]=ch[j][i];
else fail[z]=1;
}
}
}
void solve()
{
int j=1,len=strlen(ss+1);
for(rg int i=1;i<=len;i++)
{
int now=ss[i]-'a';
while(j&&!ch[j][now])j=fail[j];
if(!ch[j][now])continue;j=ch[j][now];int k=j;
while(k)vis[k]++,k=fail[k];
}
int mx=0;
for(rg int i=1;i<=n;i++)if(mx<vis[ed[i]])mx=vis[ed[i]];
printf("%d\n",mx);
for(rg int i=1;i<=n;i++)
if(mx==vis[ed[i]]){for(rg int j=1;j<=w[i];j++)printf("%c",s[i][j]);printf("\n");}
}
int main()
{
while(1)
{
read(n);if(!n)return 0;id=1;
memset(ch,0,sizeof ch);
memset(fail,0,sizeof fail);
memset(vis,0,sizeof vis);
for(rg int i=1;i<=n;i++)scanf("%s",s[i]+1),insert(s[i],i);
bfs(),scanf("%s",ss+1),solve();
}
}
luoguP3796[模板]AC自动机(加强版)的更多相关文章
- luoguP3808[模板]AC自动机(简单版)
传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...
- 算法模板——AC自动机
实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...
- 模板 AC自动机
题目描述 有$N$ 个由小写字母组成的模式串以及一个文本串$T$ .每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串$T$ 中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据 ...
- 算法竞赛模板 AC自动机
AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...
- [模板][P3796]AC自动机(加强版)
Description: 输出有哪些模式串在文本串中出现次数最多,这个次数是多少 Hint: 多组数据,$ len_{文本串}<=10^6,\sum len_{模式串} <= 70*150 ...
- 【模板】AC自动机加强版
题目大意:给定 N 个模式串和一个文本串,求每个模式串在文本串中出现的次数. 题解:文本串在自动机上匹配的过程中,记录下自动机上每一个状态被访问的次数.对于访问到的节点 i,则状态 i 的后缀中存在的 ...
- 洛谷.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 ...
随机推荐
- 高速排序及优化(Java版)
高速排序(Quicksort)是对冒泡排序的一种改进. 高速排序由C. A. R. Hoare在1962年提出. 一次高速排序具体过程: 选择数组第一个值作为枢轴值. 代码实现: package Qu ...
- nginx启动不了
nginx简介 Nginx是一个高性能的HTTP和反向代理服务器. 支持的操作系统众多,windows.linux. MacOS X: 可实现负载均衡: Rewrite功能强大: 电商架构大部分都采用 ...
- RTMP协议的理解
RTMP协议:real time message protocol 工作原理: 先采集摄像头视频和麦克风音频信息,再进行音视频的编码(mpeg),通过FMLE(Flash Media Live Enc ...
- java实现EXCEL数据导入到数据库中的格式问题的解决
之前作为项目甲方,加之java接触不多,在java web开发方面都是打下手的份. 对于EXCEL数据导入到数据库这个问题一直老是出现格式原因而导入失败也是未免惆怅,开发团队也是只说回去检查一下格式. ...
- Linux GCC常用命令学习
1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...
- 使用diskpart命令修复U盘分区
前段时间在论坛上讨论封装PE到u盘里热闹的,就想自己也封装一个,随便下载了一个WIN7的PE封装后发现还不错,本来就是做测试用的,测试完了就想把u盘在恢复成以前的样子,可是发现恢复并不是这么容易 如下 ...
- 修改SO
1.如果在jni中定义的是int型的数据,比如: JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin (JNIEnv * env, job ...
- [TJOI2016 & HEOI2016] 字符串
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4556 [算法] 不难发现 , 对于每个询问 ans = max{ mi ...
- Python使用multiprocessing实现一个最简单的分布式作业调度系统
Python使用multiprocessing实现一个最简单的分布式作业调度系统介绍Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机 ...
- openstack封装镜像
1.准备工作:准备你想要封装的各种镜像的iso,完整版本最简单版本都ok,只要能出虚拟机就行,这个大家去官网下载自己要的iso就可以,我这里用centos6.4最简版本,因为分给我的活让做这个的... ...