![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
字符串:后缀数组
文章平均质量分 91
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
UESTC 1384 卿大爷的多个女友 后缀数组、最长连续重复子串
题意:给一个字符串s,求最长连续重复子串的长度,如cdaabababcc的最长连续重复子串为ababab,长度为6。(由ab连续重复拼接而成)后缀数组、最长连续重复子串倍增算法O(nlogn)的跑出后缀数组sa[],然后再O(n)的跑出height数组,height[i] = LCP(i - 1, i); //LCP(u, v) = max{i | u[1..i] == v[1..i] }LCP(i, j) = min{LCP(k - 1, k) | 1 < k <= j}令int lcp =原创 2016-11-22 23:07:20 · 799 阅读 · 0 评论 -
HDU 6138 Fleet of the Eternal Throne 后缀数组+字典树
题意:给出n(n<=1e5)个字符串,且字符串的字符总和<=1e5,给出m个询问,每次给定x,y,找出对于给定str[x]和str[y]的公共子串且满足这个串是所有串中的某个串的前缀,要求所得的公共串的长度尽可能大。后缀数组+字典树首先用给出的n个字符串建立字典树,然后对于每次的询问,把str[x]和str[y]用‘#’连起来然后跑出后缀数组,对于所有的ind[i](其中sa[ind[i]] <= len, ind[i]为其在sa数组中的下标),然后对于 ind[i] - ind[i-1] > 1原创 2017-08-19 20:52:50 · 764 阅读 · 0 评论 -
UESTC 1551 Hesty Str1ng 后缀数组+树状数组、回文串
题意:给出一个字符串,要求选出子串A,然后自己搞一个长度小于A的子串B,把B接在A的后面,构成一个新的字符串T,要求T为回文串,求能构成的不同回文串的个数。后缀数组+树状数组、回文串刚开始的时候以为只是求不同子串的个数,匆匆忙忙就交了一发,果断wa了,自己还是太年轻了。然后发现,当选出的子串的末尾是以回文子串结尾时(确切的是以长度为偶数的回文子串,在化简一下其实是出现2个相同的字符(即最小半径了),因为更大的半径所产生的新的构造方法和最小的半径的回文子串产生新回文串的构造结果是一样的,当然这些也是原创 2017-03-27 13:24:39 · 889 阅读 · 0 评论 -
SPOJ - SUBLEX Lexicographical Substring Search 后缀数组、跑的非常快、开心、☺☺
题意:给一个长度不大于90000的字符串,每次询问它的所有不同子串中,字典序第k小的,询问不大于500个。后缀数组本来是找了一个后缀自动机的题,看了题以后觉得用后缀数组做比较方便,结果交了一发,发现自己的代码竟然是目前为止vj上这个题史上最快的,害怕开心 Y ( ^ _ ^ ) Y,首先用字符串s,倍增算法跑出 sa和height,然后把询问根据v[j].q的大小排序然后对于每个i,(1<=i<=n),cnt += (n - sa[i]) - height[i]; 表示截止当前后缀,所能表原创 2017-03-06 01:41:31 · 1280 阅读 · 6 评论 -
CSU - 1632 Repeated Substrings 后缀数组、distinct substring
题意:给出一个字符串,找出出现2次及以上的子串的种数。后缀数组跑出sa数组和height数组,然后从i = 2 ~ n遍历,每次 ans += max(0, heigt[i] - lastheight);这里减掉的是已经计算过的子串种数,可参考比此题稍难的 HDU - 3948 The Number of Palindromes 后缀数组+ST表、distinct substring复杂度 O(nlogn)原创 2017-02-22 23:57:59 · 662 阅读 · 0 评论 -
HDU - 3948 The Number of Palindromes 后缀数组+ST表、distinct substring
题意:给出一个字符串,求出其回文子串的种数。后缀数组+ST表把s变成 s + '#' + s',其中s'表示s的反向串。所以当回文子串的长度为奇数时 [i+1, _rank[n - sa[i] - 1]] 的height最小值表示以s[sa[i]]为中心的回文子串的最大半径(算上中心); 长度为偶数时 [i+1, _rank[n - sa[i]]] 的height最小值表示以s[sa[i]]为半径起点的回文子串的最大半径;找这个最大半径,可以用ST表O(nlogn)的预处理出,然后每次O(1原创 2017-02-22 23:11:54 · 888 阅读 · 0 评论 -
HDU - 2890 Longest Repeated subsequence 后缀数组+二分+贪心、不可重叠子串、离散化
题意:给出一个序列,要求找出出现过至少m次的最长(连续)子序列,求其最长长度和具体字典序最小的序列,且不能有重叠。后缀数组+二分+贪心先离散化,然后跑出后缀数组sa和height数组,然后二分答案,检查的时候,维护height[i] > mid 的sa[i]值及个数,日光个数大于等于m,则把这段区间的sa[i],排序,然后从小的开始贪,相邻的2个,如果间隔小于mid,则去掉大的比去掉小的sa[i]更好,然后讨论下一个,最后判断剩余的sa[i]的两两间隔不小于mid的sa[i]的个数大于等于m,则这就原创 2017-02-19 00:01:41 · 880 阅读 · 0 评论 -
POJ - 3882 Stammering Aliens 后缀数组、二分、二叉堆、ST表
题意:给出一个字符串,要求找出至少出现m次的最长子串长度。后缀数组、二分、二叉堆、ST表所求的就是相邻的m个后缀的LCP,即这m-1个height[i]的最小值,所以可以二分答案,或者用ST表(O(nlogn)预处理,O(1)查询)来维护,或者用二叉堆也可以,这三种方法的运行速度依次降低。原创 2017-02-17 21:27:08 · 718 阅读 · 0 评论 -
POJ - 3415 Common Substrings 后缀数组+单调栈+前缀和
题意:给出两个字符串,求出它们的相同的长度至少为k的子串的个数。后缀数组+单调栈+前缀和把a、b这两个字符串用'#'连起来,然后求出它们的后缀数组,然后后缀ai和后缀bi的的满足要求的子串的个数是 max(0, LCP(suffixai, suffixbj) - k + 1);根据后缀数组的性质,也就是后缀i后缀j的LCP 等于这段height的最小值。因此对于每个ai考虑ai之前的所有bi, sum{max(0, LCP(suffixai, suffixbj) - k + 1)} rank[ai]原创 2017-02-16 17:33:21 · 858 阅读 · 0 评论 -
HDU 6194 string string string 后缀数组+lcp、Two Pointers
题意: 给出一个字符串,询问恰好出现k次的子串的种数。后缀数组+ST表对于给定字符串,跑出sa[]和height数组,然后预处理出ST表。然后类似于Two Pointers的做法,维护一个长度为k-1的height数组的区间,一次从k到length(s)推一遍。ans += st.query_min(i - k + 2, i) - max(st.query_min(i - k + 2, i+1), st.query_min(i - k + 2 - 1, i));这里维护的是k个后缀的最大公共前缀原创 2017-09-12 16:43:31 · 1015 阅读 · 0 评论