原文地址:http://hi.baidu.com/lewutian/item/2dccf95ff5f1500ae7c4a5a4
单独把它列出来是因为这个东西真的很神奇~~~
后缀数组经典思想:多串合并+二分答案+最优性--->可行性
例 1 :最长公共前缀
给定一个字符串,询问某两个后缀的最长公共前缀。 // 直接套用,ans=min( height[ i ] )+rmq k<i<=j
例 2 :可重叠最长重复子串
给定一个字符串,求最长重复子串,这两个子串可以重叠。 // ans=max( hegiht[ i ] ) 0<=i<len
例 3 :不可重叠最长重复子串( pku1743 ) AC
给定一个字符串,求最长重复子串,这两个子串不能重叠。 // 二分转化为判定性问题
例 4 :可重叠的 k 次最长重复子串( pku3261 ) AC
给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。 // 同上,也是二分
例 5 :不相同的子串的个数( spoj694,spoj705 )
给定一个字符串,求不相同的子串的个数。
[解法]:
对于每一次新加进来的后缀 suffix(sa[k]), 它将产生 n-sa[k]+1 个新的前缀。但是其中有
height[k] 个是和前面的字符串的前缀是相同的。所以 suffix(sa[k]) 将 “ 贡献 ”
出 n-sa[k]+1- height[k] 个不同的子串。累加后便是原问题的答案。这个做法
的时间复杂度为 O(n) 。
例 6 :最长回文子串( ural1297 )
给定一个字符串,求最长回文子串。
[解法]:
将整个字 符串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为 了
求这个新的字符串的某两个后缀的最长公共前缀。
eg:aabebf ----> aabebf&fbebaa
例 7 :连续重复子串 (pku2406) AC
给定一个字符串 L ,已知这个字符串是由某个字符串 S 重复 R 次而得到的,
求 R 的最大值。
[解法]:
做法比较简单,穷举字符串 S 的长度 k ,然后判断是否满足。判断的时候,
先看字符串 L 的长度能否被 k 整除,再看 suffix(1) 和 suffix(k+1) 的最长公共
前缀是否等于 n-k 。
hit:此题更好的是考察KMP的next
int k=len-next[len];
if(len%k==0) fprintf(fout,"%d\n",len/k);
else fprintf(fout,"1\n");