【定义】 【LCP】全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 【z函数】 函数z [ i ] 表示的是,第 i 个后缀和字符串的最长前缀 【解决问题】 这两个算法都是在解决这个问题 即求后缀和字符串和后缀之间的最长公共前 ...
分类:
编程语言 时间:
2019-08-25 19:56:02
阅读次数:
121
题意:给你一个长度为n的字符串,有m次询问,每次询问l到r的子串在原串中第k次出现的位置,如果没有输出-1。n, m均为1e5级别。 思路:后悔没学后缀数组QAQ,其实只要学过后缀数组这个题还是比较好想的。这个问题可以转化为有多少个后缀和后缀l的lcp长度大于等于r - l + 1。我们知道,在后缀 ...
分类:
其他好文 时间:
2019-08-25 12:18:57
阅读次数:
263
#1415 : 后缀数组三·重复旋律3 #1415 : 后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。小Hi在练习过很多曲子以后发现很多作品中的旋律有共 ...
分类:
编程语言 时间:
2019-08-24 22:38:09
阅读次数:
146
题意:给你一个长度为n的字符串,每次询问给出三个数:L , R , K,表示原串 L 到 R 的子串在原串第K次出现的首字母的位置 解题思路:对子串的大量操作,不难想到后缀数组(后缀树/后缀自动机不会,所以没想到),注意到子串s[L.....R]必然是某一个后缀的前缀,所以所有前缀是该子串的后缀的排 ...
分类:
编程语言 时间:
2019-08-24 10:17:10
阅读次数:
248
题意 给一个长度为n的字符串,Q次询问,每次询问$(l,r,k)$ , 回答子串$s_ls_{l+1}\cdots s_r$ 第$k$ 次出现的位置,若不存在输出 1。$n\le 1e5,Q\le 1e5$ 分析 查询子串第 k 次出现的位置,很容易想到要用处理字符串的有力工具——后缀数组。 那么该 ...
分类:
编程语言 时间:
2019-08-24 00:20:24
阅读次数:
105
题意:给你一个长度为n的字符串,有q个询问,每次询问一个子串s(l,r)第k次出现的位置,若子串出现次数少于k次输出 1. 解题思路:先把SA跑出来,然后对于每次询问可以由l和rank[]找到l在所有后缀中的排名,再用两次二分求出使得LCP(L,R)包含s(l,r)的最大区间[L,R],LCP可以借 ...
分类:
编程语言 时间:
2019-08-24 00:01:25
阅读次数:
89
我们考虑,一个子串必定是某个后缀的前缀。 排序相邻的后缀他们的前缀一定最相似。 所以全部的一种子串必定是一些排序相邻的后缀的公共前缀。 从l开始的子串,则从rank[l]开始看,两侧height保证大于子串长度,能延伸多长,则证明有多少个这种子串。 我们用ST表维护出height的最小值,然后通过最 ...
分类:
编程语言 时间:
2019-08-23 20:53:06
阅读次数:
97
题目很~~简单~~,就是给出一个字符串,把这个字符串的所有非空后缀从小到大排序后,按顺序输出 后缀的第一个字符 在原串中的位置。 样例 输入样例: ababa 输出样例: 5 3 1 4 2 解释: 排好序后为: 1. a 1. aba 1. ababa 1. ba 1. baba 暴力~~肯定不行 ...
分类:
编程语言 时间:
2019-08-23 19:31:49
阅读次数:
104
一、基本概念 后缀:用 suff[i] 表示,是指从某个位置 i 开始到整个串末尾结束的一个子串。 后缀数组:用 sa[i] 表示,是指所有后缀在排完序后,排名为i的后缀在原串中的位置。 sa[排名]=位置 名次数组:用 rank[i] 表示,是指所有后缀在排序完后,原字符串中第i个后缀现在的排名。 ...
分类:
编程语言 时间:
2019-08-20 21:47:51
阅读次数:
69
例题: 往事太多,有时候忘了就忘了吧。 如果有非记不可的,就只能用点附加手段啦! 我们定义一棵往事树是一个 n 个点 n 1 条边的有向无环图,点编号为 1到 n,其中 1 号点被称为是根结点,除根结点以外, 每个点都恰有一条出边(即以其作为起点的边)。 每条边上有 1 个字符(这里我们实际上用一个 ...
分类:
编程语言 时间:
2019-08-18 11:42:31
阅读次数:
85