怎么一堆大佬写了题解,算了看见队爷假装没看见。
温馨提示:题目要求只能替换一次。注意到每个 (si,1,si,2)(s_{i,1},s_{i,2})(si,1 ,si,2 ) 实际上的替换是把除了它两端的相同字符以外的中间那一部分,因为两端的字符替换了等于没替换。而每个 (ti,1,ti,2)(t_{i,1},t_{i,2})(ti,1 ,ti,2 ) 其实是需要一个 sss 二元组使自己两端极长相同子段外的中间部分恰好被替换掉,因此要求 sss 和 ttt 二者中间的核心部分相同。同时也需要符合替换条件,也就是 sss 替换的部分放进 ttt 串里两端多余的部分是恰好匹配的。
这启发我们像 P9196 一样重构串。首先中间核心部分是匹配关键,由于 si,1=si,2s_{i,1}=s_{i,2}si,1 =si,2 其长度恰好是 sss 串单个的两倍,具有单一性,直接两端加上特殊字符,剩下部分贴在特殊字符两旁用于匹配,即拆分 (si,1,si,2)(s_{i,1},s_{i,2})(si,1 ,si,2 ) 和 (ti,1,ti,2)(t_{i,1},t_{i,2})(ti,1 ,ti,2 ) 二元组为字符串 A?BD?C\text{A?BD?C}A?BD?C,其中 ?\text{?}? 为特殊字符,两串分别为 ABC\text{ABC}ABC 和
ADC\text{ADC}ADC,A\text{A}A 和 C\text{C}C 分别为两个串的最长公共前后缀。
用 ACAM 跑多模匹配即可,由于每个 sss 最多在每个 ttt 中出现一次,出现至少一次的 sss 串数量等于所有 sss 串的出现次数,可以通过对 fail 进行前缀和规避暴力跳,这样我们在所匹配的这个节点即可直接计算贡献。
时间复杂度 O(∣∑∣L1+L2)O(|\sum|L_1+L_2)O(∣∑∣L1 +L2 )