procedure2012
It's not worth it to know you're not worth it!

最长公共前缀:LCP(i,j)=lcp(sa[i],sa[j])=height数组中的i+1,j的最小值RMQ解决。

可重叠最长公共子串:height整个数组中的最大值

不可重叠最长公共子串(pku1743):先根据二分的答案k对height数组分组,若有一组中sa[]的最大和最小值的差大于等于k就说明k成立。

可重叠的k 次最长重复子串(pku3261):二分答案判断是否有任意一组中有超过k各后缀。

//=====================================================================================

不相同的子串的个数(spoj694,spoj705):累加n-sa[i]-1-height[i],注意i从1开始,n为末尾加上'$'之后的长度。

//=====================================================================================

最长回文子串(ural1297):将原串反转接上中间隔开。然后枚举原串分奇偶求反转串中相应位置和他的LCP。

最长公共子串(pku2774,ural1517):接在一起求不再同一个串内的后缀的LCP。

//=====================================================================================

不小于k 个字符串中的最长子串(pku3294):二分答案并分组,判断是否有一组中的后缀存在于k个串中

每个字符串至少出现两次且不重叠的最长子串(spoj220):和上题一样只是判断条件变了

出现或反转后出现在每个字符串中的最长子串(PKU1226):同上只是在连接时要把反转串一起连接进取,判断条件有所改动

[注意]:单个字符串没什么好说的,只是一定不能忘记末尾一定要有一个最小的数结尾。字符串计数问题一定要从1开始,因为height[0]是没有意义的。然后就是多个或两个字符串在进行后缀数组计算前一定要想连起来中间用未在字符串中出现并且互不相同的字符隔开,且要小于任一个字符串中的其他字符(除最后,最后一个一定要使最小的)。输出方案时只需记录开始位置和长度就行,或者是找到所有满足条件的height分的组输出最后一个sa[]+长度。(ural1297ural1517)。后缀数组最精华的东西是height数组+二分答案+height数组分组+控制判断条件。

posted on 2012-03-29 23:12  procedure2012  阅读(323)  评论(0)    收藏  举报