摘要:
http://www.bianchengla.com/course/ds/practise/problem?id=1387找了半天终于找到一个可以提交的地方。。。题解:任何一个重复子串,都必然是某两个后缀的最长公共前缀。因为,两个后缀的公共前缀,它出现在这两个后缀中,并且起始位置时不同的,所以这个公共前缀必然重复出现两次以上(可重叠)。而任何两个后缀的最长公共前缀为某一段height值中的最小值,所以最大为height值中的最大值(即某个lcp(sa[i],sa[i+1]))。所以只要算出height数组,然后输出最大值就可以了。View Code 1 #include <iostrea 阅读全文
摘要:
题意:求单个子串的不重复子串个数题解:一个字符串中的所有子串都必然是它的后缀的前缀。对于每一个sa[i]后缀,它的起始位置sa[i],那么它最多能得到该后缀长度个子串(n-sa[i]个),而其中有height[i]个是与前一个后缀相同的,所以它能产生的实际后缀个数便是n-sa[i]-height[i]。遍历一次所有的后缀,将它产生的后缀数加起来便是答案。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #i 阅读全文
摘要:
题意:求str1的最长后缀与 str2 的最长前缀。使得 str1+str2 的长度最小,并且字典序最小(str1和str2可以互换)题解:kmp的p数组的含义:p[i]表示以i为结尾的字符串最多和开头匹配的个数。也正是这道题求解的关键、具体做法就是将两个字符串合并处理求一下p数组就好了~ps:合并的时候中间一定要加“分隔符”(比如:#,@之类的~),否则会有惊喜。。。abcbcbca bcbcbc 对拍了半天才发现这个bug。。。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cs 阅读全文
摘要:
题意:在给定的矩形字符串中找一个最小的矩形字符串,使其通过多次平移复制后,覆盖给定的矩形字符串题解:网上的神马求lcm的算法都是不完善的,具体解释见POJ 2185的discuss。。我的做法是把行看成一个整体,列看成一个整体做kmp。能过discuss里的数据,poj也ac了,不知道有没有漏洞。。感觉应该是对的。View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm 阅读全文