摘要: 最长公共子串问题的后缀数组解法。将第二个字符串拼接到第一个字符串中去,中间用分割符隔开,避免后面计算的时候发生一个字串横跨两个字符串的情况。之后看相邻的不在同一个字符串中的lcp的最大值即可。#include #include #include #include #include #include ... 阅读全文
posted @ 2014-09-26 22:36 acm_roll 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 这题曾经用KMP做过,用KMP 做非常的简单,h函数自带的找循环节功能。用后缀数组的话,首先枚举循环节长度k,然后比较LCP(suffix(k + 1), suffix(0)) 是否等于len - k, 如果相等显然k就是一个循环节。得到LCP的话可以通过预处理出所有点和0的lcp就好了。另外倍增法... 阅读全文
posted @ 2014-09-26 22:05 acm_roll 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 本题是利用后缀数组求最长的回文串。方法是将字符串反转之后拼接到原来的字符串末尾,中间用一个没有出现过的分割符隔开,原因是防止最长公共前缀横跨两个串。之后分别枚举回文串的中点,以及回文串长度是奇数还是偶数,看一下对应位置的最长公共前缀即可。这里的求最长公共前缀要处理RMQ问题,线段树固然可以解决,但是... 阅读全文
posted @ 2014-09-26 17:23 acm_roll 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 后缀数组求不同子序列数量的简单题。对于一个已经处理好的后缀数组,对于每一个suffix(i),必然会产生len - sa[i]个前缀(假设从0开始), 然后这len - sa[i]个前缀里面有height[i]个是和前面那个前缀相同的,所以是len - sa[i] - height[i]个,求一下和... 阅读全文
posted @ 2014-09-26 16:07 acm_roll 阅读(142) 评论(0) 推荐(0) 编辑