最长公共子串我们通常用二分答案解决。
即对于串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]不同串)