BZOJ3172 & 洛谷3966 [Tjoi2013]单词 【fail树】
3172: [Tjoi2013]单词
Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 4293  Solved: 2083
[Submit][Status][Discuss]
Description
某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。
Input
第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6
Output
输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。
Sample Input
a
aa
aaa
Sample Output
3
1
第一次遇到这道题的时候,才疏学浅的我用裸的AC自动机竟然A了。。就没有多想什么
后来遇到了阿狸的打字机,听说这题的正解是fail树,于是回来练练手
首先数据很水AC自动机可以直接过
再来正解就是fail树,就是拿fail构造的树
在整个fail图中存在多少u节点所对应的字符串,在fail树中以u为根的子树就有多大
注意:
建立fail指针时,应先将fail[0]置为一个不会用到的值,否则就会遇到根0指向的单词的fail指向自己的情况,普通AC自动机的构建也应加上这个操作
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define fo(i,x,y) for (int i = (x); i <= (y); i++)
#define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 1000005,maxm = 205,INF = 1000000000;
//begin 18:51 End 19:04
char P[maxn];
int ch[maxn][26],fail[maxn],sum[maxn],siz = 0,n,q[maxn],head,tail,E[maxm];
void insert(int p){
int u = 0,len = strlen(P),id;
for (int i = 0; i <len; i++){
id = P[i] - 'a';
++sum[u = ch[u][id] ? ch[u][id] : ch[u][id] = ++siz];
}
E[p] = u;
}
void getf(){
head = 0; tail = 1; fail[0] = -1; int u,v;
while (head < tail){
u = q[++head];
for (int i = 0 ; i < 26; i++){
v = ch[u][i];
if (!v) ch[u][i] = ch[fail[u]][i];
else q[++tail] = v,fail[v] = ch[fail[u]][i];
}
}
}
int main()
{
cin>>n;
REP(i,n) scanf("%s",P),insert(i);
getf();
for (int i = tail; i; i--) sum[fail[q[i]]] += sum[q[i]];
REP(i,n) printf("%d\n",sum[E[i]]);
return 0;
}
BZOJ3172 & 洛谷3966 [Tjoi2013]单词 【fail树】的更多相关文章
- 洛谷P3966 [TJOI2013]单词(fail树性质)
		P3966 [TJOI2013]单词 题目链接:https://www.luogu.org/problemnew/show/P3966 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单 ... 
- 洛谷P3966 [TJOI2013]单词(AC自动机)
		题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ... 
- [洛谷P3966][TJOI2013]单词
		题目大意:有$n$个字符串,求每个字符串在所有字符串中出现的次数 题解:$AC$自动机,每个节点被经过时$sz$加一,每一个字符串出现次数为其$fail$树子树$sz$和 卡点:$AC$自动机根节点为 ... 
- 洛谷P2412 查单词 [trie树 RMQ]
		题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ... 
- bzoj 3172: [Tjoi2013]单词 fail树
		题目大意: 一篇论文是由许多单词组成,现在想知道每个单词分别在论文中出现多少次. 题解: 我们首先考虑fail指针的含义 如果fail[x] = y,那么我们就知道y作为x的后缀在x中出现了一次 所以 ... 
- 洛谷P3966 [TJOI2013]单词(后缀自动机)
		传送门 统计单词出现次数……为啥大家都是写AC自动机的嘞……明明后缀自动机也能做的说…… 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ... 
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释
		P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ... 
- 洛谷p3384【模板】树链剖分题解
		洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ... 
- BZOJ3172 单词 Fail树
		题目大意:求一篇论文中每个单词分别在论文中出现多少次. 本题用AC自动机太慢,应该用Fail树将AC自动机中所有的Fail指针反向得到一个新树,这就是Fail树.对长度为x的字符串a和长度为y的字符串 ... 
随机推荐
- selenium自动化之显式等待和EC(expected_conditions)模块
			很多人都有这种经历,selenium脚本当前运行没问题,过了一段时间再运行就报错了,然后过几天又好了.其中的原因估计60%的人都知道,是因为元素加载这块有问题.通常的解决方案就是加上sleep或者隐式 ... 
- Unity Lighting - Lighting overview 照明概述
			Lighting overview 照明概述 In order to calculate the shading of a 3D object, Unity needs to know the ... 
- 游戏AI之群组行为
			群组行为指的是多个对象组队同时进行的情况.每个boid需满足分离,队列,凝聚三个基本的规则. 分离:群组中的每个个体都与相邻的个体保持一定的距离. 队列:群组以相同的速度,向相同的方向移动. 凝聚:与 ... 
- opencv-学习笔记(2)
			opencv-学习笔记(2) 这章记录了 获取像素点,改变像素点 获取图像的属性(行,列,通道数,数据类型) roi感应区 拆分以及合并图像通道 边缘扩充 opencv获取像素点,改变像素点 ---- ... 
- 【转载】android 常用开源框架
			对于Android初学者以及对于我们菜鸟,这些大神们开发的轻量级框架非常有用(更别说开源的了). 下面转载这10个框架的介绍:(按顺序来吧没有什么排名). 一. Afinal 官方介绍: Afina ... 
- react创建新项目并且修改配置文件
			react创建项目 这是我在用react搭建项目时,用到的一些东西,顺序纯属自己定义, 一.创建项目 用react 创建一个项目,这也是官方给出的 1.npm install create-react ... 
- java一些面试题
			java虚拟机 什么时候会触发full gc System.gc()方法的调用 老年代空间不足 永生区空间不足(JVM规范中运行时数据区域中的方法区,在HotSpot虚拟机中又被习惯称为永生代或者永生 ... 
- 20届的阿里 头条 网易 滴滴 百度 小米等Java面经
			转载连接 个人博客:junxuelian.cn 总结:个人感觉回答面试官问题不必太官方和书面化,腾讯sng招实习被发现照着百度百科念.结果可想而知.用自己的话和理解去回答就好.可能应届生会抱怨设计题, ... 
- HADOOP (十一).安装hbase
			下载安装包并解压设置hbase环境变量配置hbase-site.xml启动hbase检测hbase启动情况测试hbase shell 下载安装包并解压 https://mirrors.tuna.tsi ... 
- 图的遍历——BFS(队列实现)
			#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> ... 
