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行每行 ...
随机推荐
- UITableView中cell点击的绚丽动画效果
UITableView中cell点击的绚丽动画效果 本人视频教程系类 iOS中CALayer的使用 效果图: 源码: YouXianMingCell.h 与 YouXianMingCell.m / ...
- [翻译] M13BadgeView
M13BadgeView M13BadgeView is a customizable badge view for iOS applications. The badge is built to b ...
- [翻译] ZCSHoldProgress
ZCSHoldProgress 以下是使用效果: https://github.com/zshannon/ZCSHoldProgress "Your users be pressin' lo ...
- September 28th 2017 Week 39th Thursday
Every saint has a past and every sinner has a future. 圣人皆有过去,罪人皆有未来. If you were a sinner in the pas ...
- 手写阻塞队列(Condition实现)
自己实现阻塞队列的话可以采用Object下的wait和notify方法,也可以使用Lock锁提供的Condition来实现,本文就是自己手撸的一个简单的阻塞队列,部分借鉴了JDK的源码.Ps:最近看面 ...
- 查看oracle数据库版本
1. 登录sysdba用户 sqlplus / as sysdba 2. 方法一:v$version SQL> select * from v$version; 3. 方法二:product_ ...
- 自定义配置编译linux内核
1 编译linux内核原因一般情况下,我们是不需要重新去编译linux内核的,但如果你发现你需要修改内核的某个部分或者说你需要的某个模块并没有编译进内核,那里你可以通过重新编译内核来满足你的需求,比如 ...
- js等比压缩上传
一.js文件,这个是封装过的,借用了网络上的代码然后修改的 (function(window,undefined){ var upload = function(){ this.init(); }; ...
- 【转】Android 旋转动画,停止和持续旋转
旋转180度后停止 RotateAnimation rotate; rotate =new RotateAnimation(0f,180f,Animation.RELATIVE_TO_SELF, 0. ...
- Rserve详解,R语言客户端RSclient【转】
R语言服务器程序 Rserve详解 http://blog.fens.me/r-rserve-server/ Rserve的R语言客户端RSclient https://blog.csdn.net/u ...