
后缀数组
WerKeyTom_FTD
这个作者很懒,什么都没留下…
展开
-
[bzoj4319]cerc2008 Suffix reconstruction
前言不要问我为什么要刷bzoj,因为我要日常%别的大神。题目大意给定sa,输出s,无解输出-1。贪心策略求出rank,然后枚举i,如果rank[sa[i-1]+1]>rank[sa[i]+1]则s[sa[i]]要大于s[sa[i-1]]否则可以相同。 于是构造即可。参考程序#include<cstdio> #include<algorithm> #define fo(i,a,b) for(i=a;原创 2016-01-20 20:53:00 · 721 阅读 · 0 评论 -
[bzoj4516][SDOI2016]生成魔咒
题目大意初始有一个空串。每次在末尾添加一个字符(字符集是[1,1000000000]的数字),并询问当前有多少本质不同的子串。一眼SAM虽然字符集很大,但是可以map耶有木有。 n log n就可以过啦,还可以在线的很兹瓷嘛! 为了练习SA由于我是蒟蒻,所以这题我最终打的是第二眼看出来的算法——后缀数组 首先它没有强制在线! 于是可以先把最终串搞出来。 然后把最终串倒过来。那么问题就被转化原创 2016-04-22 19:07:21 · 1185 阅读 · 0 评论 -
[SPOJ 687]字符串
题目大意求一个字符串中一个连续重复子串的最大重复次数。论文题首先枚举这个子串的长度l。 那么显然,它们一定要经过0,l,2l,3l,……之中至少一个点。 枚举这个观察点il,让后缀il与后缀(i+1)l求LCP,可以用SA完成,接着假设LCP为k,那么k/l+1这个答案是合法的(可以自己动手画一画,就很容易知道),不过,有可能两个字符串不从观察点开始匹配,也就是再左移l-k%l还能再匹配一段(即原创 2016-08-16 15:47:10 · 661 阅读 · 0 评论 -
子串
题目大意SA+莫队我们把所有字符串连起来,中间有分割符分开,然后求SA。 那么,一个子串所在第几个单词可以看以其为前缀的后缀包含了几个分隔符。 对于每个询问,我们二分找出在SA上的对应区间。于是,询问可以改成这样:求[l,r]权值在[x,y]的权值种类数。 可以用莫队做,用分块维护就可以消掉log,这是经典套路。#include<cstdio> #include<algorithm> #in原创 2016-09-18 21:46:49 · 642 阅读 · 0 评论 -
后缀数组复习小记
前言学习了SAM为什么要学习SA?(没复习之前我就是传说中的只会SAM不会SA的蒟蒻) 因为有些问题SA可做SAM不可做。 (以下开始扯淡,大家可以跳过前言部分了…… 我还记得我上一次打SA是将近一年前的GDOI赛场上—— day1只考了50分的我对比同年级其他神犇十分失落。day2我开始看题: t1sb广搜呀! t2sbtarjan呀! t3奥妙重重,字符串的题……恩,我只会sa,想原创 2016-04-22 19:40:05 · 701 阅读 · 0 评论 -
子串
题目描述SA题朴素大概要个很高的复杂度。 想一个高端一点的暴力,可以只枚举两个后缀,对于这两个后缀任意前缀之间lcp可以列出数学式子,这个式子与这两个后缀的长度以及它们的lcp长度有关。 接下来我们知道lcp等于一段区间height的最小值。 因此写个sa,然后根据height建立笛卡尔树。 接着递归维护需要维护的信息,每次以一个点为lcp值统计答案。 式子因为忘了怎么推就不推啦!#inc原创 2017-05-04 15:29:17 · 479 阅读 · 0 评论 -
动物园
题目大意两个字符串a和b,从a中选取一个非空子串,从b中选取一个非空子串,然后拼起来变成回文串,求这个回文串最大长度。SAM先做一遍manacher处理出从某个串某个位置出发最长回文串。 先把b反过来。 然后你注意到这个回文串一定可以表示成c+S+c,其中S是一个回文串,然后c是a或b中选出的子串。 我的做法是把a和b一起丢去做广义SAM,然后计算每个节点是否同时出现在两个串中,并维护righ原创 2017-07-10 10:03:00 · 681 阅读 · 0 评论