P3735 字符串 题解

一句话题解:

  • “相等”等价于 \(\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\) 个矩形。
posted @ 2024-09-09 07:38  Laijinyi  阅读(1)  评论(0编辑  收藏  举报