做题记录 25.9.28

\(\textcolor{purple}\odot\) P13812 [CERC 2022] Insertions

\(n=|s|,m=|t|,k=|p|\)

考虑对于每个 \(i\) 求出 \(s[1:i]+t+s[i+1:n]\)\(p\) 的出现次数

显然可以拆分为:

  1. \(s[1:i]\)\(p\) 的出现次数
  2. \(t\)\(p\) 的出现次数
  3. \(s[i+1:n]\)\(p\) 的出现次数
  4. \(s[1:i]+t\) 中跨越分割点的出现次数
  5. \(t+s[i+1:n]\) 中跨越分割点的出现次数
  6. \(s[1:i]+t+s[i:n]\) 中跨越三段的出现次数

\(\text{1,2,3}\) 容易做到 \(O(n+m+k)\)

\(\text{4,5}\) 做法相同,以 \(\text{4}\) 为例:

等价于对于每个 \(i\)

\[\begin{aligned} &\sum_{l\le i,l<k}[s[i-l+1:i]+t[1:k-l]=p]\\ =&\sum_{l<k}[l\text{ is border of }(p+\text{'\$'}+s[1:i])][(k-l)\text{ is border of }(t+\text{'\$'}+p)]\\ \end{aligned}\]

等价于在 \(p+\text{'\$'}+s\)\(\text{fail}\) 树上给定点查询该点到根的链上满足 \((k-l)\text{ is border of }(t+\text{'\$'}+p)\land l<k\)\(l\) 数量,容易扫描线做到 \(O(m+k+n\log(n+k))\)

对于 \(6\),等价于对于每个 \(i\)

\[\begin{aligned} &\sum_{m<l<k}[s[i-(l-m)+1:i]=p[1:l-m]][t=p[l-m+1:l]][s[i+1:i+k-l]=p[l+1:k]]\\ =&\sum_{m<l<k}[(l-m)\text{ is border of }(p+\text{'\$'}+s[1:i])][t=p[l-m+1:l]][(k-l)\text{ is border of }(p^R+s[i+1:n]^R)]\\ \end{aligned}\]

等价于两颗 \(\text{fail}\) 树上分别给定点,查询同时在两个点到根的链上满足 \(m<l<k\land t=p[l-m+1:l\)\(l\) 数量,转化为静态矩形加单点查询,容易扫描线做到 \(O(m+(n+k)\log(n+k))\)

总时间复杂度 \(O(m+(n+k)\log(n+k))\)

代码

参考

posted @ 2025-09-29 18:54  Hstry  阅读(7)  评论(0)    收藏  举报