zoukankan      html  css  js  c++  java
  • 对两(多)串间最长公共字串的一个探究

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

    即对于串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]不同串)

  • 相关阅读:
    微软SQL Server 2005的30项顶尖特性
    UML统一建模语言 类关系
    设计模式 建造者模式
    设计模式 原型模式
    设计模式 简单工厂模式
    设计模式 适配器模式
    设计模式 适配器模式
    设计模式 单例模式
    设计模式 抽象工厂模式
    设计模式 桥接模式
  • 原文地址:https://www.cnblogs.com/JiuPleber/p/9256303.html
Copyright © 2011-2022 走看看