题意
做法
先来说个暴力
从前往后枚举(k=(1,2,...,n))
我们维护这样一个集合(P_k),集合内任意两个元素(i,j(i<j)),满足( ext{lcp}(S[i:],S[j:])ge k-j+1),即有可能在(ge k)的前缀中成为答案的集合
考虑从(P_{k-1})过渡到(P_k)
- 初始化(P_{k}=P_{k-1}cup {k})
- 不断加入元素,比较与末尾元素的大小关系,修正集合
最后,对(P_k)中选出最小的即可,比较两元素(i,j),发现需要做的事均为比较某前缀与后缀的( ext{lcp}),可以通过( ext{exkmp})(O(1))计算
这样总复杂度是(O(sumlimits_{i=1}^n |P_i|))的
考虑优化
考虑(i<j),比较不出大小,即(lcp(S_i,S_j)ge k-j+1)
若(k-j+1ge j-i),即前缀(k)形如(ABBC),(C)是(B)的前缀,(i)在第一个(B)开头,(j)在第二个(B)开头
(S_i=BBCA),(S_j=BCAB),(S_{j+(j-i)}=CABB)。
- 若(BCAle CAB),有(S_ile S_jle S_{2i-j})
- 若(BCAge CAB),有(S_ige S_jge S_{2i-j})
因此若出现(k-j+1ge j-i),则可以丢弃({j}),故有(j-i>k-j+1),容易得到(|P_k|)是(O(logk))的
所以总复杂度为(O(nlogn))的