后缀数组/自动机
huanghongxun
这个作者很懒,什么都没留下…
展开
-
POJ 3693 Maximum Repetition Substring 后缀数组
bzoj挂了后顿时感到人生无光。Maximum repetition substringTime Limit: 1000MS Memory Limit: 65536K Total Submissions: 8600 Accepted: 2612DescriptionThe repetition number of a string is defined as the maximu原创 2016-02-18 00:00:05 · 388 阅读 · 0 评论 -
HDU 4416 Good Article Good sentence 后缀自动机
Good Article Good sentenceProblem DescriptionIn middle school, teachers used to encourage us to pick up pretty sentences so that we could apply those sentences in our own articles. One of my classmates原创 2016-04-15 23:59:31 · 714 阅读 · 0 评论 -
HDU 4622 Reincarnation 后缀自动机
对长度2000的字符串 1W次询问区间的子串个数。发现长度很小,O(n2)O(n^2)? 发现由于后缀自动机是在线构造,因此所有的区间可以按左端点排序,右端点在线。。然后子串个数维护一下SAM的总子串数就好了。。#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define FOR(i,j原创 2016-04-16 00:28:16 · 942 阅读 · 0 评论 -
CodeForces 235C Cyclical Quest 后缀自动机
给定母串,每次询问一个字符串及其循环串在母串中的出现次数和。重复一遍循环串在母串上匹配即可。。。 要注意重复的不要再算一次了。#include <cstdio>#include <cstring>#define FOR(i,j,k) for(i=j;i<=k;++i)const int rt = 1, N = 2000005;int ch[N][26], ma[N], fa[N], vis原创 2016-04-16 19:09:40 · 713 阅读 · 0 评论 -
BZOJ 2555 SubString 后缀自动机+LCT
在线向原串尾添加字符,询问字符串在原串中的出现次数。发现每次添加字符,Right集合就会沿Parent树大小+1,考虑LCT维护Parent树,以便区间修改。14.000s。。。。#include <cstdio>#include <cstring>const int N = 1200005, rt = 1;char s[3000010];struct LCT { int c[N][原创 2016-04-17 15:13:20 · 669 阅读 · 0 评论 -
BZOJ 3998 TJOI 2015 弦论 后缀自动机
求第k大子串 http://blog.csdn.net/huanghongxun/article/details/51164051#include <cstring>#include <cstdio>#define FOR(i,j,k) for(i=j;i<=k;++i)const int rt = 1, N = 1000005;int last = 1, cnt = 1, len = 0原创 2016-04-17 16:20:10 · 626 阅读 · 0 评论 -
HDU 5558 Alice's Classified Message 后缀自动机
对于字符串S,有一个指针i,如果存在从j(#include <cstdio>#include <cstring>const int rt = 1, N = 200005;int last = 1, cnt = 1;int ch[N][26], fa[N], rr[N], ma[N];char str[N];void add(char c, int x) { int np = ++原创 2016-04-18 17:25:05 · 1497 阅读 · 1 评论 -
BZOJ 3676 UOJ 103 APIO 2014 后缀自动机 Manacher
对于所有的本质不同的回文子串,在SAM中查找对应节点,由于我们已知回文子串的右端点,因此可以在Parent树中快速定位我们要的状态。3676: [Apio2014]回文串Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1487 Solved: 623 [Submit][Status][Discuss]Description考虑一个只包含小写拉丁原创 2016-04-19 09:53:36 · 716 阅读 · 0 评论 -
BZOJ 3230 相似子串|后缀数组|RMQ
良心提示。 f=两子串的最长公共前缀后缀长度平方和的最大值。 因此开2个后缀数组分别处理前后缀。 而且得开long long..对于每个子串,其排名与后缀的排名有关,因此对于查询的子串我们找到产生该子串的后缀,而我们可以通过计算前i个后缀产生了多少个子串,并查询之得(STL大法好)。于是RMQ解决之。代码稍后贴…3230: 相似子串Time Limit: 20 Sec Memory Limi原创 2016-02-15 12:11:43 · 905 阅读 · 0 评论 -
SPOJ 1812 LCS2 后缀自动机
求给定n个串的最长公共子串。先对一个构造SAM。 接着每个串匹配一次,并处理出各状态能匹配到的最大长度(要注意沿Parent树更新),于是总的就是各状态的最小值。#include <cstring>#include <cstdio>#include <algorithm>#pragma comment(linker, "/STACK:1024000000,1024000000") usi原创 2016-04-15 23:54:24 · 582 阅读 · 0 评论 -
SPOJ 8222 NSUBSTR 后缀自动机
求长度为i的出现次数最多的子串的次数。 即找出min(s)≤i≤max(s)min(s)\leq i\leq max(s)的状态ii,使其Right集合元素个数最多。。 首先可以计算出每个状态的Right集合大小,即Parent树的子树的叶子节点数。 然后dp就好了。。一直internal error也是坑。。#include <cstring>#include <cstdio>#incl原创 2016-04-15 20:48:28 · 578 阅读 · 0 评论 -
HDU 3518 Boring Counting 后缀数组/后缀自动机
分组height?半个月没动后缀数组一堆名词都忘了233#include <cstdio>#include <cstring>#include <algorithm>#define rep(i,j,k) for(i=j;i<k;i++)#define FOR(i,j,k) for(i=j;i<=k;i++)using std::min;using std::max;#define N原创 2016-02-16 23:26:46 · 786 阅读 · 0 评论 -
BZOJ 3238 AHOI 2013 差异 后缀数组 单调
lcp(Ti,Tj)=min{hi,⋯,hj}lcp(T_i, T_j)=\min\{h_i,\cdots,h_j\} 因此考虑hih_i对于其在hh上所能向左向右延伸的区间内的所有lcp都是其答案。因此参考poj 2796。。 代码稍后3238: [Ahoi2013]差异Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1342 Solved原创 2016-02-15 23:17:39 · 433 阅读 · 0 评论 -
BZOJ 1031 JSOI 2007 字符串加密 Cipher 后缀数组
咦BZOJ 502了发生了啥。一个循环串子串排序。。恩,联系到后缀数组后缀排序功能。 因此对给出的串重复一遍建立后缀数组。 比如JSOI07的后缀数组就是:0707JSOI0777JSOI07I07I07JSOI07JSOI07JSOI07JSOI07OI07OI07JSOI07SOI07SOI07JSOI07发现,如果一个后缀的长度大于等于原长len,那么其第len个字符原创 2016-02-16 22:11:41 · 618 阅读 · 0 评论 -
SPOJ 705 New Distinct Substrings 后缀数组
LINK: http://www.spoj.com/problems/SUBST1/ bzoj 3230做着做着就滚来做这题了。。 求一个字符串的不等(?)子串个数。 比如字符串ababa,其排好序的后缀是: a aba ababa ba baba 然后每个后缀可以产生以其长度n−sai+1n-sa_i+1为个数的子串,但和有序上一个后缀会产生重复子串,个数为与其的公共前缀长度,因原创 2016-02-15 11:20:31 · 401 阅读 · 0 评论 -
BZOJ 2251 Beijing WC 2010 外星联络 后缀数组
给出一个01串,求:出现次数大于1 的子串所出现的次数。 不过数据范围有点迷。。 后缀数组模板题。 构建出后缀数组以后,每个后缀都会产生子串。 比如ababa:aabaabababababa首先第一个后缀产生了子串a,而且因为h[1],h[2]>=1,因此可以向右扩展到第三个后缀,因此出现3次。 第二个后缀产生了2个子串ab和aba,而向后h[2]>=2拓展了1次所以出现了2次。a原创 2016-02-16 23:18:41 · 679 阅读 · 0 评论 -
POJ 2774 Long Long Message 后缀数组/后缀自动机
用分隔符连接2个字符串,并且跨字符串的height才对答案有贡献。 回忆一下当时的程序。。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define rep(i,j,k) for(i=j;i<k;i++)#define MAXN 200050int n, num[MAXN], z[M原创 2016-02-16 23:22:25 · 518 阅读 · 0 评论 -
URAL 2059 Not common palindromes 回文自动机
已知A与B串。求A的本质不同的回文子串个数,分别要求出现次数比B中的多的、相等的、少。可怕的回文自动机。。 到时候试试看SAM+Manacher。。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 300005;typedef long long ll;str原创 2016-04-19 22:04:40 · 790 阅读 · 0 评论 -
POJ 1509 Glass Beads 后缀自动机
求给定字符串s从哪个位置开始的循环同构串字典序最小。如果复制一遍s,发现其所有循环同构都是新字符串ss的长度为|s|的子串。 于是后缀自动机。。dfs,不断地走字典序最小的边,直到走了|s|次即可。 而且发现,不管怎么走,SAM都至少能走|s|次。因此一条路往黑里走即可。 然后我们需要知道状态的Right集合的最小值。 而我们知道,SAM主链上的状态(由last连接的),max值均为Righ原创 2016-04-14 20:47:19 · 440 阅读 · 0 评论 -
SPOJ 7258 SUBLEX 后缀自动机
求第k大子串。按拓扑序处理出一个点往后有多少条路径到终态。 答案就很明显了。#include <cstring>#include <cstdio>#define FOR(i,j,k) for(i=j;i<=k;++i)const int rt = 1, N = 300005;int last = 1, cnt = 1, len = 0;int trans[N][26], fa[N], m原创 2016-04-15 19:04:48 · 680 阅读 · 0 评论 -
后缀自动机 小结
以下主要来自CLJ的ppt,整理并添加了一些附注(错误讲解) 以下皆为口胡,为了装逼掉RP而搞成高端(?)的形式。 神犇轻喷。 Markdown面对长博文,学校的电脑有点力不从心啊。。1 前序定义1:SAM(s)SAM(s):表示字符串s的后缀自动机。 定义2:rev(s):逆序的s。 定义3:Reg(s)Reg(s):从状态ss开始可识别的所有字符串(到目标状态)。 定义原创 2016-04-10 14:26:01 · 1169 阅读 · 0 评论