bzoj 3172 后缀数组|AC自动机】的更多相关文章

后缀数组或者AC自动机都可以,模板题. /************************************************************** Problem: 3172 User: BLADEVIL Language: C++ Result: Accepted Time:424 ms Memory:34260 kb ****************************************************************/ //By BLADEVI…
3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status][Discuss] Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词由小写字母组成,N<=200,单词长度不超过10^6…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3172 题意:给出n个单词.输出每个单词在所有单词中一共出现多少次? 思路:首先将所有单词插入到ac自动机,记录每个节点次数cnt.建立自动机.然后按照建立自动机的顺序,对于节点u以及其fail节点v,cnt[v]+=cnt[u].最后找到每个单词在自动机的对应节点u,则cnt[u]就是该单词答案. struct node{    int next[26],cnt,fail;     …
3172: [Tjoi2013]单词 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=3172 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词由小写字母组成,N<=200,单词长度不…
题目链接:[http://www.lydsy.com/JudgeOnline/problem.php?id=3172] 题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号隔开. 题解:时间很坑啊,朴素的做法是,先在AC自动机上插入单词,并记录下每个单词,然后用每个单词去维护答案.但是这样做时间空间都不允许,只有在插入的时候维护答案.过程是这样的,在插入的时候,每经过一个点,该节点的值加一,同时记录单词末尾的位置,然后在求玩Fail的时候,倒着走回去就可以了. #in…
(一下只供自己复习用,目的是对比这几个题,所以写得不详细.需要细节的可以参考其他博主) [BZOJ3172:单词] 题目: 某人读论文,一篇论文是由许多(N)单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次.N<=200,总单词长度不超过10^6. 思路: 简单题,建立AC自动机,插入的时候每个位置都++,代表以当前位置为后缀的字符串的个数,用于fail转移时累加.然后build得到fail指针:最后从叶子向根累加. #include<bits/stdc…
题目链接 \(Description\) 给n个模式串,问是否存在长度无限的主串,使得任何一个模式串都没有在主串中出现. \(Solution\) 先建AC自动机. 假设我们有了一个无限长的安全代码,然后在AC自动机上匹配应该发生什么? 应该是匹配到一个位置失败跳回去,之后要再匹配到这个位置(必须跳回当前链)再失败跳回去.跳回去就是通过fail指针. Trie树上连上fail指针的边后(其实就是Build时改的son),如果能在这个有向图上找到环,就TAK. 或者,安全代码无限长的话前后要能拼起…
题目大意: 给定两个序列判断是否循环同构,若循环同构则输出最小表示 题解: 因为没有样例输入输出,一开始没看到要求输出最小表示 Wa一大页. 但不得不说bzoj还是挺高效的: 赞一个 XD.jpg 判断是否循环同构用kmp即可,可惜本人并不会kmp,用的AC自动机. 然后去学了一发求最小表示法方法...这...貌似是模板题.. #include <cstdio> #include <cstring> #include <algorithm> using namespac…
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3881 题解: 这道题我想出了三种做法,不过只有最后一种能过. 第一种: 首先我们把所有的操作离线下来,把所有的字符串全部插入,构建fail树 对于每个字符串记录插入时间,并设S集合中的字符串的插入时间为无限大 然后对于每一个询问,查找fail树中以\(S_x\)为根的子树里有多少插入时间小于询问时间的节点. 这一步可以处理出dfs序后用可持久化线段树搞. 但是它TLE了,我觉得这种做法…
写了一半 没了啊啊啊 重新写的 思路: 先不考虑后缀自动机 (我不会啊) 那这道题只能用后缀数组了 先把原串倒一下 后缀->前缀 相当于每回在前面加了一个字母 求不同的子串个数 首先 正常的求子串个数我们是会的 SPOJ 705 但是这道题比较坑 它让你每回都输出一下 那只好 维护一个前驱 一个后继 求LCP 取max ans=ans+n-i+1-max(LCP(),LCP()) 用set维护前驱和后继就好啦~ //By SiriusRen #include <set> #include…