当前位置: 代码迷 >> 综合 >> GDOI 2016 Day1 T2 最长公共子串
  详细解决方案

GDOI 2016 Day1 T2 最长公共子串

热度:104   发布时间:2023-10-29 06:23:26.0

题意

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

题解

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

代码

我是来口胡做法的