GDOI 2016 Day1 T2 最长公共子串

题意

给出两个字符串A和B,求最长公共子串。
其中B串中有k个区间的字符可以任意调换。
|A|,|B|<=2000,k<=100000

题解

一个显然的性质就是,如果两个区间有交集,那是可以并成一个的
然后我们就来考虑怎么做。。
一个十分朴素的想法,是枚举两个的起点,然后暴力往后匹配
这样做是 O ( n 3 ) 的,不满足要求
但是我们考虑一下,枚举两个起点会怎么样?
其实就是确定了两个串的匹配位置是那两个,也就是相当于枚举了一个偏移量
于是,我们就考虑直接枚举偏移量
这样,我们枚举了一个偏移量之后
我们就可以DP了
f [ i ] 表示B串i往后的最优代价,然后根据若干段区间连续的转移就可以了。。
胡乱讨论一下。。因为区间是不相交的。。这个的话显然是 O ( n )
然后就可以 O ( n 2 )
当然我们也可以直接DP
f [ i ] [ j ] i , j
这个的话
转移分两种
就是i可以匹配,那么直接搞。。
否则,就看一下从前面挖一个这个字母过来
然后就可以了
后者写起来比较简单

代码

我是来口胡做法的

猜你喜欢

转载自blog.csdn.net/qq_36797743/article/details/80288553
今日推荐