后缀数组
xtttgo
这个作者很懒,什么都没留下…
展开
-
HDU 1403 Longest Common Substring(后缀数组入门)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1403拖了这么久的后缀数组,终于准备学一学了。 做的第一题(套的第一个板子),虽然还是没看不懂是怎么实现的,但是还是可以套一套的。suffix(i)表示[0,len)的字符串的一个后缀,下标为[i,len)。后缀数组里,要求的是三个数组,sa[],rank[],height[]。 sa[i]表示的排名为原创 2016-08-14 10:28:33 · 577 阅读 · 0 评论 -
POJ 2406 Power Strings (后缀数组入门--最大重复次数)
传送门:http://poj.org/problem?id=2406 题意就是,这个字符串是由x个字符串重复得到的,问你x最大是多少。就是求最小的循环节。 用KMP也可以做。作为后缀数组的练习也可以,使用了DC3算法,当做是模板好了。思路:假设长度为len,一个循环节为n,那么只要整个字符串和后面(len-n)长度的字符串的最长公共前缀是len-n就可以了。suffix(sa[i])和suffi原创 2016-08-20 20:10:02 · 430 阅读 · 0 评论 -
HDU 2459 Maximum repetition substring(后缀数组+RMQ-重复次数最多的子串)
传送门:http://acm.split.hdu.edu.cn/showproblem.php?pid=2459 思路:枚举子串的长度。这个思路很精髓,就是长度重复子串肯定会包含str[0],str[l],str[l * 2],str[l * 3]……中的相邻两个,然后我们求出相邻两个的最长公共前缀,然后算一下一共重复了几次,再把字符串往前推,是否能找到重复的起始位置,然后再一边用rank数组更原创 2016-08-22 14:58:43 · 363 阅读 · 0 评论 -
HDU 3518 Boring counting(后缀数组)
传送门:http://acm.split.hdu.edu.cn/showproblem.php?pid=3518 问你有几种子串出现了2次以上。水题。 只要用后缀数组求出height,然后枚举长度,把height按照长度分组,如果一组里的最小的sa和最大的sa,不重叠,就可以把ans++。#include <cstdio>#include <cstring>#include <algorit原创 2016-08-22 15:36:27 · 341 阅读 · 0 评论 -
HDU 2328 Corporate Identity(后缀数组-求多个串的最长共同子串)
传送门:http://acm.split.hdu.edu.cn/showproblem.php?pid=2328 思路:把所有字符串拼接起来,中间用’#’隔开,然后把这个问题转化为判定性的问题,判定是否存在一个长度为x的子串是共同子串。求出所有子串中的最少长度。然后从1~minlen中二分判定,按照当前的判定长度对height进行分组,如果碰到存在就返回在字符串中的下标,否则就继续二分,不存在就输原创 2016-08-22 18:00:46 · 702 阅读 · 0 评论 -
HDU 5769 Substring(后缀数组)
传送门:http://acm.split.hdu.edu.cn/showproblem.php?pid=5769 思路:不考虑X字符,先考虑怎么求本质不同的串有几个,那么就是枚举一遍height数组,去掉前缀相同的就可以了。 我们考虑X字符的话,就要保证所有求得的串都要包含这个字符。那么我们事先求一个数组,pos[i]表示当前字符(包括自身)的右边的第一个X字符的位置。然后还是枚举h原创 2016-08-25 20:35:57 · 333 阅读 · 0 评论