给两个长度为$n$的$a,b$字符串。和长度$m$的字符串$s$。
有多少组$[l_a,r_a],[l_b,r_b]$满足
两个字符串两部分与$s$去匹配,$exkmp$处理$a$与$s$的最长前缀,$b$与$s$的最长后缀(这里倒置$exkmp$)。
我们就可以得到$a_i$最多向后拓展多少,$b_j$最多向前拓展多少。不关心第一个条件。对于一组$a_i,b_j$,可以组成$b_j-(m-a_i+1)$。
考虑第一个条件,需要有交集。对于每个$i$,最差情况$j-i+1=m-1$,此时它们相交临界值。那么只需要查询$x\in[i,min(m,i+m-2)],\sum (b_x-(m-a_i+1))=\sum b_x-num*\sum(m-a_i+1)),num$=满足条件的数,,用树状数组维护下就$ok$。
代码
1 |
|