问题

给定文本串SS和模式串TT,求SS的一个最长子串,使得其为TT重复其某个子区间的结果。

题解

KMP

SS正向做一次TT的匹配,记录SS每个前缀preipre_i尾部能匹配到的TT最长的前缀,记做fif_i

SS逆向做一次TT的匹配,记录SS每个后缀sufisuf_i前部能匹配到的TT最长的后缀,记做gig_ialt

如果fi+gi+1>Tf_i + g_{i + 1} > |T|,则可以更新答案。

时间复杂度O(S+T)O(|S| + |T|)

吐槽

其实这题代码很短,出题人和验题人都认为是Medium Easy或者Medium难度,但很奇妙的是内榜和外榜都一直没人做这题,校内吹了一堆F的气球没发出去。感觉榜有些歪?

虽然说题解是KMP,但实际过题方法众多。我的某个队友写了哈希+二分,另一个因为没带SAM板子干脆就没写,真是绝活。