对两(多)串间最长公共字串的一个探究

最长公共子串我们通常用二分答案解决。

即对于串A、串B、串C……二分最长字串长度,利用height数组性质,单调队列解决。

但是,对于两个串之间,我发现直接寻找满足sa[i]和sa[i+1]在不同串的lcp[i]就行了。为什么呢?

考虑假设有suf[sa[x]]和suf[sa[x+2]]两串满足:

  lcp(suf[sa[x]],suf[sa[x+2]]) > lcp(suf[sa[i]],suf[sa[i+1]])(sa[x],sa[x+2]不同串,sa[i],sa[i+1]不同串)

那么根据抽屉原理sa[x],sa[x+1],sa[x+2]三个数至少有两个待在同一个串。

因为sa[x]和sa[x+2]不同串,那么必定有:

  sa[x],sa[x+1]不同串 || sa[x+1],sa[x+2]不同串。

那么可以令i=x或x+1,使得:

  lcp(suf[sa[x]],suf[sa[x+2]]) <=lcp(suf[sa[i]],suf[sa[i+1]])(sa[x],sa[x+2]不同串,sa[i],sa[i+1]不同串)

因此不存在x使对于任意i都有:lcp(suf[sa[x]],suf[sa[x+2]]) > lcp(suf[sa[i]],suf[sa[i+1]])(sa[x],sa[x+2]不同串,sa[i],sa[i+1]不同串)。

同理,不存在任何一个x对于任意i有:lcp(suf[sa[x]],suf[sa[x+p]]) > lcp(suf[sa[i]],suf[sa[i+1]])(p>=2,sa[x],sa[x+p]不同串,sa[i],sa[i+1]不同串)。

依此结论我们可以证明,对于n个字符串的最长公共字串,不存在任何一个x对于任意i,q有:

  lcp(suf[sa[x]],suf[sa[x+p]]) > lcp(suf[sa[i]],suf[sa[i+q]])(p>=n,q<=n-1,sa[x],sa[x+p]不同串,sa[i],sa[i+n-1]不同串)。

猜你喜欢

转载自www.cnblogs.com/JiuPleber/p/9256303.html
今日推荐