随笔分类 - 后缀数组
摘要:也许应该叫后缀排序,是求出sa[i],rk[i]的一种算法。 sa[i]代表排名为i的后缀的开始位置。 rk[i]代表开始位置为i的后缀的排名。 这是实现比原理要复杂的算法。 先求出sa[i]之后再求出rk[i]。 考虑先求出长度为1时候的sa[i]数组。这个时候$s
阅读全文
摘要:首先要差分+离散化。 然后就是求形如ABA的串有多少,其中B的长度确定为k。 我们用到了设置关键点的思想。我们枚举A的长度L。然后在1,1+L,1+L2,1+L3。。。设置关键点。然后我们枚举这些关键点,试图求出跨过这个关键点的长度为L的在B左边的A有多少个。 可以证明这样可以做到不重不漏,
阅读全文
摘要:一个初步的想法是我们枚举重复子串的长度L。然后跑一遍SA。然后我们枚举一个点i,令他的对应点为i+L,然后求出这两个点的LCP和LCS的长度答案就是这个点的答案就是(len(LCP)+len(LCS)+L1)/L。这个可以用跟EXKMP的类似的方法证明。 但是这样会T。 那么如
阅读全文
摘要:求出一个串使得这个串是s1,s2的子串。串中不包含s3。 如果没有这个s3就可以二分答案,然后height小于二分值分一组。看看每组里是不是出现过s1,s2的后缀。判断就行。 然后有了s3之后,我们考虑改变一下height数组。 我们把s1s2拼在一起构成一个新串s。(中
阅读全文
摘要:很容易想到只考虑后缀长度必须为max(height[rk[i]],height[rk[i]+1])+1(即[i,i+x1]代表的串只出现过一次)然后我正着做一遍反着做一遍,再取一个min最后挂了。。。 设x=max(height[rk[i]],height[rk[i]+1])+1我
阅读全文
摘要:一开始的时候感觉就是一个主席树裸题。 然后发现自己错了。 首先建出后缀数组。 设irk[j]显然i更优。 如果$rk[i] include include include include include include include using namespace std; const int
阅读全文
摘要:我们把所有的名,姓,询问都拼起来构成一个新的长串,然后跑一边SA。排完序后对于每一个询问,我们可以二分求出它所对应的区间(即满足这个区间的前缀都是这个询问串)。然后问题就转化为很多区间问区间出现过的不同的数。这个东西可以用离线后吧询问按右端点从小到大排序+树状数组解决(HH的项链,采花)。 那么第二
阅读全文
摘要:~~1A真舒服。~~ 喜闻乐见的树链剖分+SA。 一个初步的想法就是用树链剖分,把两个字符串求出然后hash+二分求lcp。。。不存在的。 因为考虑到这个字符串是有序的,我们需要把每一条重链对应的字符串和这个重链反过来对应的字符串拼起来构成一个新的字符串。我们用树链剖分拼出两个字符串。用树剖拼出的这
阅读全文
摘要:解法一:后缀数组 听说后缀数组解第k小本质不同的子串是一个经典问题。 把后缀排好序后第i个串的本质不同的串的贡献就是n−sa[i]+1−LCP(i,i−1)然后我们累加这个贡献,看到哪一个串的时候,这个贡献的和大于等于k,然后答案就在这个串里了,然后枚举就行了。 那么第k小子串该怎么办? 我们考
阅读全文
摘要:题意 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。“主题”是整个音符序列的一个子串,它需要满足如下条件: 1.长度至少为5个音符。 2.在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了
阅读全文
摘要:题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组。 然后求出heigth数组。 跑单调队列就行了。找出每k个数中最小的数的最大值。就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不多快,可能是因为二分是一个常见的模型吧)
阅读全文