@bzoj - 4259@ 残缺的字符串
目录 @description@ @solution@ @accepted code@ @details@ @description@ 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n。可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同程度的残缺。 你想对这两个串重新进行匹配,其中A为模板串,那么现在问题来了,请回答,对于B的每一个位置i,从这个位置开始连续m个字符形成的子串是否可能与A串完全匹配? 原题链接。 @solution@ 据说已经成了套路题。 以下内容中假定以 0 为字符串下标起点。 考虑没有通配符的情况,B 中第 j 个位置开头的串能否与 A 匹配。实际上是计算式子 \(\sum_{i=0}^{m-1}[A_i\not = B_{i+j}]\) 是否为 0。 注意到这个注意匹配的形式很像卷积。不过别急,我们先把其拆成数值计算的形式:上式为 0 等价于 \(\sum_{i=0}^{m-1}(A_i - B_{i+j})^2\) 。 由完全平方的非负性可以得到等价性。 有通配符怎么办?A, B 其中一个为通配符,构造出来的式子就应该等于 0。 不妨令通配符等于 0,则计算 \(\sum_{i=0}^{m-1}(A_i - B_{i+j})^2\times A_i \times B_{i+j}\)