cjoj P1435 - 【模板题 USACO】AC自动机 && 洛谷 P3796 【模板】AC自动机(加强版)
又打了一遍AC自动稽。
海星。
好像是第一次打trie图,很久以前就听闻这个思想了。OrzYYB~
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cstring>
#define il inline
#define rg register
#define vd void
#define sta static
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
struct node{
int son[26];
int fail;
int tot;
}S[150*75];int id;
char T[150][75],str[1000001];
int len[150];
il int newnode(){
++id;
for(rg int i=0;i<26;++i)S[id].son[i]=0;
S[id].fail=S[id].tot=0;
return id;
}
il vd insert(char*s,int n){
int x=0;
for(rg int i=0;i<n;++i)
if(S[x].son[s[i]-'a'])x=S[x].son[s[i]-'a'];
else x=S[x].son[s[i]-'a']=newnode();
}
int que[501],hd,tl;
il vd build_fail(){
hd=tl=0;
for(rg int i=0;i<26;++i)
if(S[0].son[i]){
int x=S[0].son[i];
que[tl++]=x;
S[x].fail=0;
}
while(hd^tl){
int x=que[hd];
for(rg int i=0;i<26;++i)
if(S[x].son[i]){
que[tl++]=S[x].son[i];
S[S[x].son[i]].fail=S[S[x].fail].son[i];
}else S[x].son[i]=S[S[x].fail].son[i];
++hd;
}
}
int main(){
#ifdef xzz
freopen("3796.in","r",stdin);
freopen("3796.out","w",stdout);
#endif
while(1){
int n=gi();if(!n)break;
id=0;
for(rg int i=0;i<26;++i)S[0].son[i]=0;
S[0].fail=S[0].tot=0;
for(rg int i=1;i<=n;++i)scanf("%s",T[i]+1),len[i]=strlen(T[i]+1),insert(T[i]+1,len[i]);
build_fail();
scanf("%s",str+1);
int m=strlen(str+1);
int x=0;
for(rg int i=1;i<=m;++i)x=S[x].son[str[i]-'a'],++S[x].tot;
for(rg int i=tl-1;i;--i){
x=que[i];
S[S[x].fail].tot+=S[x].tot;
}
static int ans[151];
for(rg int i=1;i<=n;++i){
int x=0;
for(rg int j=1;j<=len[i];++j)x=S[x].son[T[i][j]-'a'];
ans[i]=S[x].tot;
}
ans[0]=0;for(rg int i=1;i<=n;++i)ans[0]=std::max(ans[0],ans[i]);
printf("%d\n",ans[0]);
for(rg int i=1;i<=n;++i)if(ans[i]==ans[0])printf("%s\n",T[i]+1);
}
return 0;
}
cjoj P1435 - 【模板题 USACO】AC自动机 && 洛谷 P3796 【模板】AC自动机(加强版)的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P1120 小木棍 [数据加强版](搜索)
洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷P3796 - 【模板】AC自动机(加强版)
原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int co ...
- 洛谷P3796 【模板】AC自动机(加强版)(AC自动机)
洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...
- 洛谷-P3796-【模板】AC自动机(加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,在fail边的基础上再加一个last边, ...
- 洛谷 P3808 【模板】AC自动机(简单版)洛谷 P3796 【模板】AC自动机(加强版)
https://www.cnblogs.com/gtarcoder/p/4820560.html 每个节点的后缀指针fail指针指向: 例如he,she,his,hers的例子(见蓝书P214): 7 ...
- 【最大流ISAP】洛谷P3376模板题
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
随机推荐
- [源码] YoCelsius
YoCelsius 视频查看地址 苹果商店免费下载 最美应用介绍 源码地址 未完成的功能 [说明] 1. 本人写了几乎所有的显示控件与动画效果 2. 希望有人能喜欢,下载软件后给个好评 3. ...
- 搭建企业级NFS网络文件共享服务说明[一]
1.1.0. 概述: 共享/NFS目录给整个192.168.25.0/24网段主机读写 man nfs 可以查看mount的信息 rpc端口111 nfs主端口2049 1.1.1. 搭建NFS环境 ...
- AppHangB1:explorer进程停止与Windows交互
现象:Windows 7,打开 “计算机” 的时候,资源管理器卡死,如图所示. 解决方法:卸载 CAD迷你看图软件,利用 CCleaner 清除注册表.
- Skype for Business Server 2015 企业语音部署和配置
Skype for Business Server 2015包含的企业语音功能可实现更丰富的通信和协作.例如,可以将企业语音部署配置为启用Skype for Business Server 2015客 ...
- Hadoop HBase概念学习系列之HBase里的列式数据库(十七)
列式数据库,从数据存储方式上有别于行式数据库,所有数据按列存取. 行式数据库在做一些列分析时,必须将所有列的信息全部读取出来 而列式数据库由于其是按列存取,因此只需在特定列做I/O即可完成查询与分析, ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- ssh无密码登陆远程机,pssh轻批量工具
#B(client)--------A(g_server)#A: ssh-keygen -t rsa (g_server)#B: scp -P 58422 root@g_server_ip: ...
- 1060. [ZJOI2007]时态同步【树形DP】
Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路 ...
- 【node.js】模块系统、函数
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩 ...
- [luogu3942] 将军令
题面 题目的意思大概是给你一棵n个点的树, 求最少需要多少个多少个点, 整棵树都被覆盖(覆盖的意思是所有离被选中的点距离不大于k的点都视作已覆盖). 考虑贪心(其实我考试的时候以为是道树形dp ...