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 第一个一个整 ...
随机推荐
- EmguCV 一些基本操作
http://www.cnblogs.com/alsofly/p/3524866.html?utm_source=tuicool&utm_medium=referral 一.先是在程序中图像的 ...
- JS获取select选中的值,所有option值
<select name="myselect" id="myselect"> <option value="2042"&g ...
- C# 文件操作大全
1.创建文件夹//using System.IO;Directory.CreateDirectory(%%1); 2.创建文件//using System.IO;File.Create(%%1); 3 ...
- Latent Semantic Analysis (LSA) Tutorial 潜语义分析LSA介绍 一
Latent Semantic Analysis (LSA) Tutorial 译:http://www.puffinwarellc.com/index.php/news-and-articles/a ...
- Java I/O流体系
- UnityShader:HSV(色相,饱和度,亮度)转换
http://blog.csdn.net/costfine/article/details/46930473 发现其实美术调整颜色的时候大部分都是调整的HSV,因为可以方便的分别调整色相(hue).饱 ...
- Ubuntu下如何安装YouCompleteMe插件
Ubuntu安装YouCompleteMe插件 简介: 众所周知, Vim是一款linux下的文本编辑器, 其最基础的工作就是编辑文本,而不管该文本的内容是什么. 在Vim被程序员所使用后,其慢慢的被 ...
- git命令之git tag 给当前分支打标签
git tag - 标签相关操作 发表于 2011年06月29日 由 机器猫 标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签$ ...
- CKEditor的使用方法
CKEditor的使用方法 2014-03-31 09:44 8649人阅读 评论(1) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. ckeditor 的官方网站是 http:/ ...
- OC-类方法
类方法 1. 基本概念 直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表) 2. 类方法和对象方法对比 1) 对象方法 以减号-开头 只能让对象调用,没有对象,这个方 ...