看到子串出现类直接套上一个 SAM。
然后非常套路地使用线段树合并来维护子树的 endpos。
我们的限制即相当于是,给定一堆长度相等的线段(存在线段树里),然后要你算多少种方案插两根针不会把所有线段全部插到。
我们考虑正难则反,考虑多少种会把所有插到。
然后我们再转化,考虑一根针能插到的线段的起点位置是一个线段,即我们要选两个定长线段覆盖所有点。
这个问题简单多了,我们设第一个线段的末尾是 $x$,另一个的开头是 $y$。
我们先假设两个不是线段,我们假设要用 $[-\infin, x]$ 和 $[y,\infin]$ 来覆盖所有点。
二元限制我们画成图,容易发现满足条件的 $(x,y)$ 点对是一个右下角的,阶梯状面积,其中凹点在 $x=y$ 上,且凹点的 $x$ 就是点的位置。
然后我们考虑两个线段的限制,他其实就是给 $x$ 设定了一个上界,$y$ 设定了一个下界,然后这样合法的仍旧是一个阶梯状。
我们考虑在使用线段树维护阶梯状的时候,我们不从横坐标维护有多少个 $y$ 满足在当前 $x$ 下合法,我们维护那个突出去主对角线的面积。
你发现这个东西是好维护的,你对每个线段树节点维护第一个和最后一个点,然后 pushup 的时候算一下两边的贡献然后额外把少算的贡献算上即可。