一句话题解:
- “相等”等价于 \(\text{LCP}+\text{LCS}+k\ge\text{len}\)
- 对于每个字符串 \(p\),枚举其 LCP 长度,同时确定 LCS 长度,问题变成统计有多少 \(i\),满足 \(s[i-|\text{LCP}|+1..i]=\text{LCP}\),\(s[i+k+1..i+k+|\text{LCS}|]=\text{LCS}\)。
- 得出解法:对 \(p\) 建 ACAM,对其反串建 ACAM,一个 \(i\) 对 \(p[1..j]\) 有贡献,相当于 \(s[1..i]\) 在 \(p[1..j]\) 的 fail 树子树中,且 \(s[i+k+1..n]\) 的反串在 \(p[j+k+1..|p|]\) 的反串的 fail 树子树中,条件形如 \(f(i)\in[l_1..r_1]\land g(i+k+1)\in[l_2..r_2]\),二维数点即可。
- 去重:答案 \(=\text{Ans}(k)-\text{Ans}(k-1)\)。
记一点代码上的问题:
- \(|p|\le k\) 时特判,\(\text{Ans}(k)=|s|-|p|+1,\text{Ans}(k-1)=0\)。
- 二维数点时矩形数应该开两倍,因为对于每个 \(|p|\) 最多产生 \(|p|+1\) 个矩形,\(2\cdot10^5\) 个 \(p\) 最多产生 \(4\cdot 10^5\) 个矩形。