8.17模拟赛

T3.模板串

依然KMP+DP解决。

可以发现这样一个事情,模板串一定是原串的前缀和后缀,这就想到了kmp解决。

设f[i]为S的前缀i的最短模板串长,g[i]为长度为i的模板串可以覆盖到的位置。

f[i]一定可以等于i,但是可能存在更优解,而这个更优解就在f[fail[i]]中,考虑重叠的情况,必须在[i-fail[i],i)中有一个f[j]==f[fail[i]],才能覆盖到i位置。

也就是g[f[fail[i]]>=i-fail[i],就可以判定f[i]=f[fail[i]]。

时间复杂度O(n)

posted @ 2018-08-18 10:45  GhostCai  阅读(67)  评论(0编辑  收藏  举报