一、题目
二、解法
首先一定要注意看题,题目求的是 s[a..b]的所有子串和s[c..d]的最长公共前缀
先对原串建出后缀自动机,可以二分答案,我们只用计算 s [ a . . b ] s[a..b] s[a..b]中有没有 s [ c . . c + x − 1 ] s[c..c+x-1] s[c..c+x−1],我们需要先找出 s [ c . . c + x − 1 ] s[c..c+x-1] s[c..c+x−1]在自动机上对应的节点,可以先确定 s [ 1.. c + x − 1 ] s[1..c+x-1] s[1..c+x−1]的位置,然后倍增找到第一个长度大于等于 x x x的节点。
之后在找到的这个点上查询它在 s [ a . . b ] s[a..b] s[a..b]中有没有出现过,这个部分可以用线段树合并维护 e n d p o s endpos endpos集合实现。时间复杂度 O ( n log n 2 ) O(n\log n^2) O(nlogn2)。
#include