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