后缀数组
Clove_unique
All that you have lost can be won back bit by bit as long as you wish for it.
展开
-
后缀数组 模板 (敲定)
打ATP原创 2016-05-11 13:57:00 · 912 阅读 · 2 评论 -
[BZOJ3879]SvT(后缀数组+单调栈)
题目描述传送门题解求出sa和height 把每一组询问的子串按照rank排序,顺序枚举每一个后缀,每一个后缀的贡献就应该为它与它前面的所有后缀的lcp之和 维护一个单调递增的栈、栈中每一个元素的数量以及栈中元素和就可以了代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmat原创 2017-01-11 14:39:03 · 998 阅读 · 0 评论 -
[BZOJ4199][Noi2015]品酒大会(后缀数组+并查集)
题目描述传送门题解别出心裁的一道sa,想了好久。。40ptsO(n2)O(n^2)的做法应该很好想吧 sa+st表就可以了qwq100pts首先求出height数组 考虑如果只求一个r的话怎么做 显然可以将height数组分组,每个组里都是height>=r的,然后对于每一个组计数+取max 那么如果有多个r呢?显然r大的要比r小的分的组少一些 换句话说就是如果已经将r分组,再将r-1分组原创 2017-02-16 11:27:34 · 631 阅读 · 0 评论 -
[BZOJ4556][Tjoi2016&Heoi2016]字符串(后缀数组+二分+st表+主席树)
题目描述传送门题解思路清晰就很好写… 首先二分答案mid 找到Suffix(c),在height数组中向左向右分别二分最远的lcp为mid的后缀 用st表实现O(1)O(1)查询 然后就判断[l,r]中是否出现了a…b的后缀 用可持久化线段树判断即可常数大,需要卡卡常数 学习了学姐的一个方法就是这种只需要判断有没有数的不用求具体几个的就只要有数了就返回,不做无用功然后说一下如何在heig原创 2017-01-11 14:52:00 · 903 阅读 · 0 评论 -
[BZOJ4278][ONTAK2015]Tasowanie(后缀数组+贪心)
题目描述传送门题解和队列变换那道题差不多 就是将两个串连起来求一个sa,然后归并的时候如果两个数相等的话就拿后缀字典序比较小的那一个 中间要加一个比较大的字符,因为如果两个串比较代码总结后缀数组一定要写p>=n,不要写p>n 从10s+蹦到2s+原创 2017-03-03 07:17:56 · 601 阅读 · 0 评论 -
[BZOJ3796]Mushroom追妹纸(hash+后缀数组+二分)
题目描述传送门题解把s1和s2接在一起,中间加一个分隔符 预处理出s3在s1和s2中的哪些位置出现过(hash) 求出sa和height,容易知道答案一定在相邻的两个在不同串里的后缀中产生 对于每一对相邻的后缀,二分一下满足条件的最大长度,即没有出现s3(前缀和) 时间复杂度O(nlogn)O(nlogn)代码#include<algorithm>#include<iostream>#i原创 2017-03-28 16:18:22 · 958 阅读 · 0 评论 -
后缀数组 学习笔记
后缀数组定义搞懂定义是学习后缀数组的关键。 子串:字符串 S 的子串 r[i..j] ,i ≤ j ,表示 r 串中从 i 到 j 这一段,就是顺次排列r[i],r[i+1],…,r[j]形成的字符串。 后缀:后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串 r 的从 第 i 个字 符 开 始 的 后 缀 表 示 为 Suffix(i) ,也就是Suffix(i)=r[i..l原创 2016-12-29 07:09:27 · 1276 阅读 · 4 评论 -
[POJ1743]Musical Theme(后缀数组||后缀自动机)
题目描述传送门题解用height搞事情。。。 某个子串一定是一个后缀的前缀。 两个后缀的最长公共前缀是在 height 数组上的区间最小值。 先二分答案,把题目变成判定性问题:判断是否存在两个长度为mid的子串是相同的,且不重叠。把排序后的后缀分成若干组,其中每组的后缀之间的 height 值都不小于 k 。有希望成为最长公共前缀不小于 k 的两个后缀一定在同一组。 然后对于每组后缀,只须判断原创 2016-12-26 11:21:07 · 1330 阅读 · 2 评论 -
[BZOJ3238][Ahoi2013]差异(后缀数组+单调栈||后缀自动机+树形dp)
题目描述传送门题解这道题实际上还是非常有趣的。 首先根据题目的描述答案应该为所有后缀的组合长度再减去两两的lcp 首先算出来总和 求出sa和height,用两次单调栈可以求出来以某一个点的height为最小值的最长区间 可以发现以这个点为分界点,区间的左右两边两两组合最小值一定是当前点的height,也就是lcp的长度 然后再计算答案就可以了代码#include<iostream>#in原创 2016-12-28 10:00:50 · 818 阅读 · 0 评论 -
[BZOJ4516][Sdoi2016]生成魔咒(后缀数组+链表||后缀自动机)
题目描述传送门题解题意实际上是求对于每一个前缀本质不同的子串个数 那么可以转化为对于每一个前缀只求包含最后一个点的和前面不重复的子串个数,然后将答案累加 把串反过来建后缀数组 然后实际上就是对于每一个后缀求与其它后缀不重复的前缀个数,也即是后缀长度减去height值 但是需要注意的一点是要排除在其后面的后缀的干扰 那么可以倒序求解,求解之后将这个后缀删除,height不升,可以用链表维护一原创 2016-12-28 18:38:57 · 1016 阅读 · 0 评论 -
[BZOJ2534]Uva10829L-gap字符串(后缀数组+st表)
题目描述传送门题目大意:求字符串s中有多少子串,满足形如ABA形式,其中A是非空字符串,且B的长度正好为L题解这道题和股市的预测实际上时一样的…不过现在忘得快干净了… B的长度已知是L,首先枚举A的长度i 然后将整个字符串按照长度为i分块,枚举每一个块的端点,设为l,令r=l+i+m,然后对l和r求lcp和lcs,可以发现长度为i+L+i的子串在长度为lcp+lcs的范围内滑动都是合法的,所以对原创 2017-04-18 08:59:10 · 1100 阅读 · 0 评论 -
[BZOJ4698][Sdoi2008]Sandy的卡片(后缀数组+st表||后缀自动机)
题目描述传送门题目大意:给出n个长度为mi的串,求趋势相同的最长公共子串题解将前后两个数差分之后就是一个裸的最长公共子串问题了 将所有的串怼在一起求sa和height,然后用一个指针扫出来至少含有n个串的代码#include#include#include#include#includeusing namespace std;#define N 20000原创 2017-04-16 21:44:23 · 811 阅读 · 0 评论 -
[BZOJ2119]股市的预测(后缀数组+st表)
唯有痛彻,才能迎来真正的涅槃。原创 2016-08-16 22:49:29 · 1330 阅读 · 0 评论 -
[BZOJ2251][2010Beijing Wc]外星联络(后缀数组)
题目描述传送门题解首先求出来sa和height 然后其实就是暴力计算一下每一个后缀向后延伸多远。 注意要去掉重复的,也就是说要从每一个最长的那个后缀开始,并且对于每一个后缀,要从大到小合并。 时间复杂度O(nlogn+n2)O(nlogn+n^2)代码#include<iostream>#include<cstring>#include<cstdio>using namespace st原创 2016-12-28 09:55:24 · 836 阅读 · 0 评论 -
[BZOJ3230]相似子串(后缀数组+二分+st表)
题目描述传送门题解题目实际上是要求最长公共前缀和后缀的长度的平方和。个人认为题目描述中a和b应该取min 把这个串正反都求一下sa和height 由于是本质不同的子串,所以每一个后缀的贡献应该是当前串刨去它和前一个的lcp的剩下的前缀 可以求出贡献的前缀和,显然满足单调性 对于每组询问,二分找出这两个子串在rank里的位置,然后用rmq求区间最小值 再找出这两个子串的结尾的位置,在反串那边原创 2016-12-28 11:30:35 · 960 阅读 · 3 评论 -
[BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
错过的年华在北漠开出斑斓的紫薇花,却荒芜了轮回的春夏。原创 2016-05-11 19:12:09 · 1037 阅读 · 0 评论 -
[BZOJ1031][JSOI2007]字符加密Cipher(后缀数组)
每一个不甘的离开都是为了最后的归来。原创 2016-04-17 18:46:07 · 858 阅读 · 0 评论 -
[BZOJ1692][Usaco2007 Dec]队列变换(贪心+后缀数组)
青春,就是注定了要颠簸,要有眼泪和汗水,有委屈、不甘和失败。原创 2016-08-20 10:46:19 · 937 阅读 · 0 评论 -
[SPOJ705]DISUBSTR - Distinct Substrings(后缀数组)
题目描述传送门题解每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数。如果所有的后缀按照suffix(sa[1]), suffix(sa[2]),suffix(sa[3]), …… ,suffix(sa[n]) 的顺序计算,不难发现,对于每一次新加进来的后缀suffix(sa[k]), 它将产生 n-sa[k]+1 个新的前缀。但是其中有 height[k] 个是和前面原创 2016-12-26 11:24:19 · 702 阅读 · 0 评论 -
[SPOJ687]REPEATS - Repeats(后缀数组+st)
题目描述传送门 题意:给定一个字符串,求重复次数最多的连续重复子串。题解先枚举长度 L ,然后求长度为 L 的子串最多能连续出现几次。首先连续出现 1 次是肯定可以的,所以这里只考虑至少 2 次的情况。假设在原字符串中连续出现 2 次,记这个子字符串为 S ,那么 S 肯定包括了字符 r[0], r[L], r[L*2], r[L*3], …… 中的某相邻的两个。所以只须看字符 r[L*i] 和原创 2016-12-26 11:29:14 · 737 阅读 · 0 评论 -
[POJ3693]Maximum repetition substring(后缀数组+st)
题目描述传送门 题意:给定一个字符串,求重复次数最多的连续重复子串。输出满足题意的子串,如果有多个,输出字典序最小的。题解先枚举长度 L ,然后求长度为 L 的子串最多能连续出现几次。首先连续出现 1 次是肯定可以的,所以这里只考虑至少 2 次的情况。假设在原字符串中连续出现 2 次,记这个子字符串为 S ,那么 S 肯定包括了字符 r[0], r[L], r[L*2], r[L*3], …… 中原创 2016-12-26 11:36:16 · 594 阅读 · 0 评论 -
[POJ2774]Long Long Message(后缀数组)
不去追寻你所渴求,你将永远不会拥有。原创 2016-08-20 10:30:33 · 814 阅读 · 0 评论 -
[POJ3415]Common Substrings(后缀数组+单调栈)
题目描述传送门 题意:给定两个字符串 A 和 B ,求长度不小于 k 的公共子串的个数(可以相同)。题解首先把一个串接在另一个串的后面,中间放一个没出现过的字符。 由于每一个子串都是某一个后缀的前缀,求出sa和height了之后,我们可以将height分组,组内都是height>=k的后缀。可以知道长度不小于k的公共子串是两个后缀的前缀,并且它们一定在同一组内。 那么对于每一组,从前往后扫,假原创 2016-12-26 21:20:13 · 1906 阅读 · 0 评论 -
[BZOJ3277]串(后缀数组+二分+st表)
题目描述传送门题解orz hxy sam随便艹 不过我感觉这道题用sa的做法非常厉害吖 由于每一个子串一定是某一个后缀的前缀,所以可以对于每一个后缀求其对答案能贡献多少个子串,也就是这个后缀有多少个满足题意的前缀。同时可以发现,对于同一个后缀SiS_i,如果Si,jS_{i,j}满足题意那么Si,i...Si,jS_{i,i}...S_{i,j}都满足题意,也就是说这个贡献的值也是满足单调性的,原创 2016-12-27 18:59:14 · 1228 阅读 · 0 评论 -
[POJ3294]Life Forms(后缀数组+二分)
题目描述传送门题解将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求sa和height。然后二分答案,将后缀分成若干组,每一组的height都不小于mid,判断每组后缀是否出现在不小于 k=n/2+1 个的原串中。注意: ①n=1的时候要特判 ②每一个height都不能超过它本身表示的字符串的长度代码#include<iostream>#include<cstring>原创 2016-12-27 20:12:05 · 824 阅读 · 0 评论 -
[SPOJ220]PHRASES - Relevant Phrases of Annihilation(后缀数组+二分)
题目描述传送门 题意:给定 n 个字符串,求在每个字符串中至少出现两次且不重叠的最长子串。题解先将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,再将后缀分组。判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并且在每个原来的字符串中,后缀的起始位置的最大值与最小值之差是否不小于当前答案(判断能否做到不重叠)。代码#include<al原创 2016-12-27 22:59:26 · 724 阅读 · 0 评论 -
[POJ1226]Substrings(后缀数组+二分)
题目描述传送门题解先将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,再将后缀分组。判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并且在每个原来的字符串中,后缀的起始位置的最大值与最小值之差是否不小于当前答案(判断能否做到不重叠)。代码#include<iostream>#include<cstring>#include<cstd原创 2016-12-27 23:02:21 · 927 阅读 · 0 评论 -
[BZOJ4319]cerc2008 Suffix reconstruction(贪心+构造+后缀数组)
题目描述传送门题目大意:给出一个sa,求一个合法的字符串的方案,或无解-1。题解无解就是a..z都填完了但是还不够 所以肯定是按照rank填,填的过程中相邻两个rank的地方尽量是一样的,实在不行再不一样 按照rank从小到大填数,对于相邻两个rank,比较两个的后面那个位置,如果后面的那个位置前面的rank小于后面的rank,说明这两个位置是可以填一样的,否则不行代码#include<algo原创 2017-05-04 17:24:23 · 722 阅读 · 0 评论