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

  • 相关阅读:
    SDN第二次作业
    事后诸葛亮
    SDN第一次上机作业
    个人作业——软件产品案例分析
    SDN第一次作业
    Alpha冲刺总结报告
    Alpha冲刺Day10
    Alpha冲刺Day9
    Alpha冲刺Day8
    Alpha冲刺Day7
  • 原文地址:https://www.cnblogs.com/JiuPleber/p/9256303.html
Copyright © 2011-2022 走看看