BZOJ3172——[Tjoi2013]单词
1、 题目大意:一篇论文是由许多单词组成,现在想知道每个单词分别在论文中出现多少次。
2、分析:对着 广义后缀自动机的图看,我们就会发现玄机,答案不就是这个单词下的后缀个数吗?
于是建立自动机,然后求出right,统计答案就好,另外说一句,right集合用基数排序之后更新一下就好
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; struct SAM{ struct node{ int tranc[27], fa, len, right; } a[2002010]; int c[2002010], od[2002010]; int cnt, tail; SAM(){ tail = ++ cnt; } void insert(int k){ int p, np = ++ cnt, q, nq; a[np].len = a[tail].len + 1; a[np].right = 1; for(p = tail; p && !a[p].tranc[k]; p = a[p].fa) a[p].tranc[k] = np; if(!p) a[np].fa = 1; else{ q = a[p].tranc[k]; if(a[q].len == a[p].len + 1) a[np].fa = q; else{ a[nq = ++ cnt] = a[q]; a[q].fa = a[np].fa = nq; a[nq].len = a[p].len + 1; a[nq].right = 0; for(; a[p].tranc[k] == q; p = a[p].fa) a[p].tranc[k] = nq; } } tail = np; } void init(int m){ for(int i = 1; i <= cnt; i ++) c[a[i].len] ++; for(int i = 1; i <= m; i ++) c[i] += c[i - 1]; for(int i = cnt; i >= 1; i --) od[c[a[i].len] --] = i; for(int i = cnt; i >= 1; i --){ int x = od[i]; a[a[x].fa].right+=a[x].right; } return; } } sam; char str[2000100]; int tot; int main(){ int n; scanf("%d", &n); tot = -1; for(int i = 1; i <= n; i ++){ char ch = getchar(); while(ch < 'a' || ch > 'z') ch = getchar(); while('a' <= ch && ch <= 'z'){ str[++ tot] = ch; ch = getchar(); } str[++ tot] = 'z'+1; } tot ++; for(int i = 0; i < tot; i ++) sam.insert(str[i] - 'a'); sam.init(tot); int num; int o = 0; for(int i = 1; i <= n; i ++){ int now = 1, j; for(j = o; ((int)str[j] != 'z'+1) && (j < tot); j ++){ now = sam.a[now].tranc[str[j]-'a']; } o = j + 1; printf("%d\n", sam.a[now].right); } return 0; }
BZOJ3172——[Tjoi2013]单词的更多相关文章
- BZOJ3172 [Tjoi2013]单词 【AC自动机】
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4293 Solved: 2083 [Submit][Stat ...
- [Bzoj3172][Tjoi2013]单词(fail树)
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 4777 Solved: 2345[Submit][Status ...
- BZOJ3172 [Tjoi2013]单词 字符串 SA ST表
原文链接http://www.cnblogs.com/zhouzhendong/p/9026543.html 题目传送门 - BZOJ3172 题意 输入$n(n\leq 200)$个字符串,保证长度 ...
- BZOJ3172: [Tjoi2013]单词
传送门 做了这么多题怎么还是无法很好的理解AC自动机呢..果然是个制杖 首先题意表述不是很清晰,这些所有的单词组成了那个文章,所以果断建个AC自动机,建的时候给每个点附加一个权值,建树是经过一次权值即 ...
- bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3172 构建AC自动机 在fail树上,点i的子树大小 表示trie树上根节点到i构成的单词 是 多 ...
- BZOJ3172[Tjoi2013]单词——AC自动机(fail树)
题目描述 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个 ...
- bzoj3172: [Tjoi2013]单词 ac自动机
某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词 ...
- [BZOJ3172 ][Tjoi2013]单词(AC自动机)
Description 不稳定的传送门 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次.单词个数<=200,单词总长度< ...
- 【AC自动机】bzoj3172: [Tjoi2013]单词
fail图上后缀和需要注意一下 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整 ...
随机推荐
- 深入理解JavaScript中创建对象模式的演变(原型)
深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...
- Docker入门教程(七)Docker API
Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...
- JavaWeb---总结(十八)JSP属性范围
所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...
- sudo和rpm命令
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户的登录 和管理时间,同样也提高了安全 ...
- JavaScript学习笔记——对象分类
对象的分类 一.对象的分类 1.内置对象 Global Math 2.本地对象 Array Number String Boolean Function RegExp 3.宿主对象 DOM BOM 二 ...
- JSP 核心标签库
1 JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 2 JSTL标签库分类 核心标 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了.在正式开 ...
- OpenGL Tutorial
https://open.gl https://www.processing.org/tutorials/pshader/
- ecshop变量介绍
获得商品的信息,get_goods_info($goods_id) 获取前10销量排名,get_top10()
- 计算div里面li个数
方式一:js var content=document.getElementById("content"); alert(document.getElementsByTagName ...