后缀数组
Joker & Liar
这个作者很懒,什么都没留下…
展开
-
2020牛客多校(第一场)- A.B-Suffix Array
题目描述:给定一个仅含字母 aaa 和 bbb 的字符串 ttt ,并给出 BBB 数组的构造方法:若存在 j<i and ti=tjj<i~and~t_i=t_jj<i and ti=tj ,则 Bi=min1≤j<i,ti=tj{i−j},B_i=min_{1\leq j<i,t_i=t_j}\{i-j\},Bi=min1≤j<i,ti=tj{i−j},否则,bi=0.b_i=0.bi=0.现在要求对原创 2020-07-21 20:11:01 · 187 阅读 · 0 评论 -
「AHOI2013」差异
分析:len(Ti)+len(Tj) 不难想,每个后缀出现了 n-1 次 ,所以总的长度是 n*(n+1)/2*(n-1),问题就转化成求:我们知道对于 lcp(i,j)=min(ht[i+1...j]),则对于固定的 j ,lcp(i+1...j-1,j)的值是非递增的,那么就可以用单调栈维护每个 ht[k]的出现次数和后缀个数代码:#include<...原创 2020-03-29 22:15:16 · 120 阅读 · 0 评论 -
【NOI2015】品酒大会
分析:首先可以想到 r 相似的两个子串肯定是满足 1...r-1 相似的,我们先求一遍后缀数组,根据 sa 数组的性质,0相似 即sa[1..n]整个区间,1 相似即将 1..n 划分成若干个区间,每个区间内的最长公共子串为 1,依次类推下去,则 一个 i-1 相似 的区间是由两个或多个 i 相似的区间合并的,类似并查集的合并过程。由此,我们可以以ht 数组的值从大到小遍历,维护...原创 2020-03-29 14:14:46 · 189 阅读 · 0 评论 -
POJ - 3294 (Life Forms)
题意:给定 m 个字符串,求一个最长子串,使得这个子串至少在一半以上的字符串中出现过,若无解输出 "?" ,多解按字典序排序输出分析:将 m 个字符串连接起来,相邻两个之间用独特的数组连接,求一遍后缀数组,然后二分枚举最长的长度判断就好了,因为有多解要全部输出,所以判断的时候要记录下代码:#include<vector>#include<cstdio&...原创 2020-03-28 23:59:48 · 194 阅读 · 0 评论 -
POJ - 3415 (Common Substring)
题意:求两个字符串长度不小于 K 的公共子串个数分析:将两个字符串 A 和 B 连接起来,中间用其它字符隔开,求一遍后缀数组,根据 sa 数组的性质,设sa[l...r]为连续一段公共子串长度>=K的后缀,那么对于某个 i (l<=i<=r) 若 sa[i]属于 A ,则它的贡献可以是: 对于每个 A ,我们都这样统计一遍,则我们计算了所有的按照sa...原创 2020-03-28 21:32:21 · 227 阅读 · 0 评论 -
SPOJ - REPEATS 687 & POJ - 3693 (Maximum repetition substring)
题意:找到字符串中重复次数最多的连续重复子串,输出这个次数分析:考虑枚举循环节的长度 L,若我们知道这个连续重复子串的起点 s ,则 lcp(s,s+L)+L即这个子串的长度,次数即 (lcp(s,s+L)+L)/ L,但是如果我们枚举 L 再内层枚举起点 s,复杂度就是O(n^2)考虑枚举的L,把整个字符串分成若干个长度为L的区间[1,L],[L+1,2*L]... 枚举所有...原创 2020-03-27 16:31:06 · 94 阅读 · 0 评论 -
SPOJ - PHRASES (Relevant Phrases of Annihilation)
题意:给定 n 个字符串,找到最长的一个子串 s,使得 s 在每个字符串中至少不重叠出现两次,求出这个长度;分析:将 n 个字符串连接起来,两两之间加上不相同未在正文出现的字符,求一遍后缀数组,然后二分这个最大子串长度判断就好了代码:#include<cstdio>#include<cstring>#include<iostream>...原创 2020-03-25 14:42:16 · 134 阅读 · 0 评论