BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)
题意:链接
方法:AC自己主动机与fail树性质
解析:复习AC自己主动机的第一道题?(真正的第一题明明是又一次写了遍hdu2222!
)
这题说实话第一眼看上去就是个sb题,仅仅要建出来自己主动机。然后搜fail树即可了。只是看完140142的博客貌似这样会T?只是他也过了是什么鬼?反正想想后没想到什么好的方法就去看了看题解。写题解的大牛们的思路能够概括成一句话,也就是fail树的性质:
你要查找某个串的出现次数则为该串的根节点在fail树上出现的次数之和。
恩知道了这个性质后(能够yy下),这道题能够再来个优化,也就是在build的时候能够将这个整个树的bfs序求出来,又由于fail节点都是后面的连到前面的,所以无后效性,也就是说,我们能够从这个栈的栈顶抽元素,并将他的end值加到他的fail节点上。这样也许会快非常多?
输出部分就是我们之前说的了。找到每一个串的根节点。询问他的end值即可。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 210
#define M 1000100
using namespace std;
int n,L,root,size;
char s[N][M];
int next[M][27],fail[M],end[M],q[M];
int newnode()
{
for(int i=1;i<=26;i++)next[size][i]=-1;
end[size++]=0;
return size-1;
}
void init()
{
size=0;
root=newnode();
}
void ins()
{
int l=strlen(s[L]);
int now=root;
for(int i=0;i<l;i++)
{
int tmp=s[L][i]-'a'+1;
if(next[now][tmp]==-1)next[now][tmp]=newnode();
now=next[now][tmp];
end[now]++;
}
}
void build()
{
int LL=0,RR=-1;
for(int i=1;i<=26;i++)
{
if(next[root][i]==-1)next[root][i]=root;
else
{
fail[next[root][i]]=root;
q[++RR]=next[root][i];
}
}
while(LL<=RR)
{
int u=q[LL++];
for(int i=1;i<=26;i++)
{
if(next[u][i]==-1)next[u][i]=next[fail[u]][i];
else
{
fail[next[u][i]]=next[fail[u]][i];
q[++RR]=next[u][i];
}
}
}
for(int i=RR;i>=0;i--)
{
end[fail[q[i]]]+=end[q[i]];
}
}
int main()
{
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
L++;
ins();
}
build();
L=1;
for(int i=1;i<=n;i++)
{
int k=root;
int l=strlen(s[i]);
for(int j=0;j<l;j++)k=next[k][s[i][j]-'a'+1];
printf("%d\n",end[k]);
}
}
BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)的更多相关文章
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- bzoj 3172: [Tjoi2013]单词 AC自动机
3172: [Tjoi2013]单词 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 3172 [Tjoi2013]单词 AC自动机Fail树
题目链接:[http://www.lydsy.com/JudgeOnline/problem.php?id=3172] 题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号 ...
- [BZOJ 3172] [Tjoi2013] 单词 【AC自动机】
题目链接:BZOJ - 3172 题目分析: 题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高. 这里使用AC自动机的“副产品”——Fail树,Fail树的一个性 ...
- BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 268 Solved: 145 [ Submit][ St ...
- BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划
标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太 再也不怕错误的数据范围--有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机 ...
- bzoj 3172 [Tjoi2013]单词(fail树,DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3172 [题意] 题目的意思是这样的,给若干个单词,求每个单词在这一堆单词中的出现次数. ...
- bzoj 3172: [Tjoi2013]单词【AC自动机】
一眼AC自动机,就是先把串建一个自动机,标记每个串在自动机上的位置,然后加上间隔符连成一个串在自动机上跑,每跑到一个点就说明这个串以及它到root的所有点表示的串都要被更新一次 先在点上打上标记,最后 ...
- ●BZOJ 3172 [Tjoi2013]单词
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3172 题解: 把单词逐个接起来,中间用互不相同的字符连接,并记录下每个单词的首字母在串中的位 ...
随机推荐
- 基于用Path.Combine的优化
Path.Combine: 什么时候会用到Path.Combine呢?,当然是连接路径字符串的时候! 所以下面的代码可以完美的工作: public static void Main() { strin ...
- Java编程的逻辑 (57) - 二进制文件和字节流
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 【PAT】1051 Pop Sequence (25)(25 分)
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...
- 【转】java取整和java四舍五入方法
java取整和java四舍五入方法 import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetI ...
- Ubuntu美化及配置,常见问题解决方案
安装符合审美观,并且具有可用性的Ubuntu桌面,需要耗费一些时间与精力不过,相信我,这值得去做,你会享受这中间的过程,以及最后的成果 首先,我推荐安装的软件列表如下,在安装前,需要先执行以下的步骤: ...
- 子域名枚举工具Sublist3r
子域名枚举工具Sublist3r 通过搜集子域名信息,可以找到目标的关联网站,找寻相应的漏洞.Kali Linux提供一款基于OSINT的枚举工具Sublist3r.该工具会搜索多个数据来源,如G ...
- 【WIN10】Segoe MDL2 Assets
APP下載地址:https://www.microsoft.com/store/apps/9nblggh5k2hf 最近使用文本圖標Segoe MDL2 Assets時,使用字符映射表看,那個圖標真的 ...
- 网络与多线程---OC中多线程使用方法(一)
小编在此之前,通过一个小例子,简单的形容了一下进程与线程之间的关系,现在网络编程中的多线程说一下!!! *进程的基本概念 每一个进程都是一个应用程序,都有自己独立的内存空间,一般来说一个应用程序存在一 ...
- [TJOI2015]线性代数
OJ题号:BZOJ3996 题目大意: 给定一个矩阵$B_{nn}$,矩阵$C_{1n}$,存在一个01矩阵$A_{1,n}$使得$d=(A\times B-c)\times A^\mathsf{T} ...
- poj 3368 rmq ***
题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数. #include<cstdio> #include<iostream> #incl ...