后缀数组的应用一

1、可重叠的最长连续子串

题意:给一个字符串,问重复出现的连续的子串中最长的,重复的子串可以有重叠的部分,若结果不止一个则输出字典序最小的

例:对于字符串"abcabcabc",结果为"abcabc";对于字符串"abcdggabc",结果为"abc"

解法:找到height数组中最大的,假设height[i]是最大的,其值为s,则后缀Sa[i]的前s个字符就是结果

2、不可重叠的最长连续子串

题目:POJ1743

题意:给一个字符串,问重复出现的连续的子串中最长的,重复的连续子串不能有重叠的部分,若结果不止一个则输出字典序最小的

例:对于字符串"abcabcabc",结果为"abc";对于字符串"abcdggabc",结果为"abc"

3、可重叠且至少出现k次的最长连续子串

题目:POJ3261

题意:给一个字符串,问重复出现至少k次的连续的子串中最长的,重复的子串可重叠,若结果不止一个则输出字典序最小的

例:对于字符串"abcabcabcabc",若k=3,结果为"abcabc";对于字符串"abcdgggabc",k=3,结果为"g"

4、连续子串个数

题目:SPOJ-DISUBSTR    SPOJ-SUBST1

题意:给一个字符串、求出字符串中不同的连续子串的个数

例:对于字符串"abc",结果为3+2+1=6;对于字符串"abcc",结果为:3+3+2+1=9

解法:其实结果就是所有子串的个数减去height数组之和,至于为什么这样做是正确的呢?显而易见,最终结果=所有子串的个数-重复的子串个数,考虑每个位置i对重复子串的贡献度,对于以位置i开始的字符串,这些字符串的有多少是重复的呢?其实就是后缀i与其他后缀的最长公共前缀长度,也就是height[ Rank[i] ],所以所有的重复的子串就是每个位置的对于重复子串的贡献度之和,也就是height数组之和

你可能感兴趣的:(数据结构)