最长重复子串湖南长沙市雅礼中学龙凡【关键词】扩展KMP算法二分后缀数组后缀树【引言】近些年来,字符串类型的试题越来越多的出现在信息学竞赛中
而字符串处理中常常出现的一类问题即——最长重复子串
本文将讨论最长重复子串问题及它的几种变形,并给出实际应用中效果较好的解决该类问题的几种方法
文中将涉及到使用扩展KMP、后缀数组等工具性算法
这些算法的具体方法与实现请参考近年来的国家集训队论文
【连续最长重复子串】1
问题描述给定一个长度为N的字符串S
记为S的第I个字符到第J个字符所组成的子串
若存在,则称S存在一个长度为K的连续重复子串
现在要你求出K的最大值,满足存在一个值I使得
基于二分的算法枚举K,然后扫描的方法的时间复杂度高达O(N2),效果并不能让人满意
我们需要更高效的算法,这里给出一个基于二分结合扩展KMP算法的算法,时间复杂度为O(Nlog2N)
在介绍主算法之前,我们先来简要介绍扩展KMP算法,这里并不对扩展KMP算法具体如何实现进行介绍,仅仅为了方便读者理解,介绍扩展KMP算法的功能
具体的扩展KMP算法的实现,请参考2003年国家集训队林希德的论文
扩展KMP算法:对于一个主串S,和一个模式串T
而扩展KMP算法可以在O(Len(S)+Len(T))时间复杂度内求解q(1)…q(len(s))
现在回到主算法,对于一个给定的串S
设Ans(S)为该串的连续最长重复子串长度
那么可以知道:其中Cross(l,r,mid)表示:在s(l,r)中,包含s(mid)和s(mid+1)这两个字符的连续最长重复子串长度
根据上面的性质,我们二分求解Ans(S(l,r)),令
如果我们能够在O(r-l)的时间复杂度内求解Cross(l,r,mid),则我们可以在O(nlog2n)的时间复杂度内求解Ans(s(1,n))
我们分两种情况来讨论包含s(mid)、s(m