Meet in the middle + 二维前缀和.
首先可以补集转化一下,用 $2^n$ 减掉三个不等式都不成立的方案数.
将每个 $r$ 变为 $n-1-r$ ,则我们需要求出与每个串相同的字符数都不超过对应的 $r$ 的方案数.
首先可以将这三个串都异或上第一个串,答案不变,于是一个位置只会有 $000,001,010,011$ 这四种情况.
记串 $S$ 中,这四种位置上 $0$ 的数目分别为 $c_0,c_1,c_2,c_3$ .
考虑 Meet in the middle, 先枚举 $c_0,c_1$ ,再枚举 $c_2,c_3$ ,询问能凑成合法四元组的 $c_0,c_1$ 的贡献总和.
看上去有 3 个维度的限制,但是 $c_0,c_1$ 对应的点中有 2 维是一样的,于是可以缩成 2 维,变成单点加,最后矩形求和.
由于每个维度的坐标都不会超过 $2n$ ,所以直接用二维前缀和处理即可.
1 | //%std |