JZOJ.4486 【GDOI 2016 Day1】第二题 最长公共子串

Problem

Description

这里写图片描述

Input

这里写图片描述

Output

这里写图片描述

Sample Input

样例1
xabcdafg
aafbcd
1
0 2
样例2
xabcdafg
aafbcd
2
0 2
2 5

Sample Output

样例1
4
样例2
6

Data Constraint

这里写图片描述

Solution

我最近新学了一个办法,叫双指针法。

Prepare

将字符串的每一个下标往后挪一位,0~n-1变成1~n。
读入的l,r需改为l+1,r+1,这样更加的好算。
别看K有10^5这么大,其实他有很多重叠的部分。
所以我们还要将那些没有被读入的区间覆盖到的下标补上。
接下来我们来合并区间。
先快排一遍,如果对于两个区间[a,b],[c,d](a<=d),如果c<=b,则可以将这两个区间合并成[a,d]。
顺便统计每个区间每个字母的个数。(这步很重要)

双指针法

假设s与t有交集,图片如下:
这里写图片描述
定义指针i,j与x,y,i,j表示在s与t的交集中相对于t串i,j所在的位置,x,y表示在s与t的交集中相对于s串x,y所在的位置。
首先j+1,将S[j]统计进一个数组里,这个数组表示当前s内的此区间的字母个数。如果此时此区间内的这个字母的个数大于原来s串此区间字母的个数则说明不合法,此时i要加1.如果i超过了有效位置,则说明s和t这样交集得到的最长公共子串的长度为0。如果i没有超过有效位置则要统计一下答案。
顺便说一句,如果i,j变化,那么x要随i+1而+1,那么y要随j+1而+1。

至于为什么要想到双指针法

看到字符串,且这道题问的是2个字符串的最长公共子串的长度,那么我们很容易想到队列。然后可以拓展到双指针。
——2016.5.18

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值