【后缀数组求最长公共子串】POJ 2774

本文介绍了如何使用后缀数组解决POJ 2774问题,即求两个字符串的最长公共子串。通过将第二个字符串添加到第一个字符串后面,并插入一个特殊字符,然后构建后缀数组和高度数组,可以高效地找出最长公共子串。关键在于确定相邻后缀来自不同字符串时的高度值最大值,整体时间复杂度为O(|A|+|B|)。
摘要由CSDN通过智能技术生成

根据罗的论文,两个串的中间要加一个ascii码比任何字母都小的字符

最长公共子串(pku2774,ural1517)
给定两个字符串A 和B,求最长公共子串。
算法分析:
字符串的任何一个子串都是这个字符串的某个后缀的前缀。求A 和B 的最长公共子串等价于求A 的后缀和B 的后缀的最长公共前缀的最大值。如果枚举A和B 的所有的后缀,那么这样做显然效率低下。由于要计算A 的后缀和B 的后缀的最长公共前缀,所以先将第二个字符串写在第一个字符串后面,中间用一个没有出现过的字符隔开,再求这个新的字符串的后缀数组。观察一下,看看能不能从这个新的字符串的后缀数组中找到一些规律。以A=“aaaba”,B=“abaa”为例,如图 所示。


那么是不是所有的height 值中的最大值就是答案呢?不一定!有可能这两个后缀是在同一个字符串中的, 所以实际上只有当suffix(sa[i-1]) 和suffix(sa[i])不是同一个字符串中的两个后缀时,height[i]才是满足条件的。而这其中的最大值就是答案。记字符串A 和字符串B 的长度分别为|A|和|B|。求新的字符串的后缀数组和height 数组的时间是O(|A|+|B|),然后求排名相邻但原来不在同一个字符串中的两个后缀的height 值的最大值, 时间也是O(|A|+|B|),所以整个做法的时间复杂度为O(|A|+|B|)。时间复杂度已经取到下限,由此看出,这是一个非常优秀的算法。

#define maxn 211111
int wa[maxn],wb[maxn],wv[maxn],wss[maxn];//论文模板的ws竟然跟g++里的关键字冲突!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值