字符串专题2

https://cplusoj.com/d/senior/contest/69f1af731363e1a076b0f21f

P4075 [SDOI2016] 模式字符串

点分治,由于链长度已经固定,所以只需要维护 \(u\) 到分治根的路径是否是 \(s\) 重复若干次然后是 \(s\) 的一个前缀即可。
这可以哈希处理。

CF954I Yet Another String Matching Problem

由于 \(\Sigma\) 较小,考虑枚举所有字符最后变成的集合,然后两个串跑 kmp 即可。

P5284 [十二省联考 2019] 字符串问题

把串反过来,这样变成后缀关系。\(B\to A\) 的边是 parent tree 上往子树连边。

AT_agc027_e [AGC027E] ABBreviate

将 a 看作 1,b 看作 2,在 mod 3 意义下合并就是相加,这样缩完后总和不变。
我们断言,只有 ababa... 或者 mod 3=0 的串是不能删成单个字符的。

  • 证明:考虑如果一个串缩完后变成 ababa... 那么一定会出现连续四个相同字符,我们缩左边两个或者右边两个就可以递归子问题。

现在考虑类似自动机上 dp,设 \(f_i\) 表示 \(i\) 前缀可以匹配多少个串。
\(i\) 对于 a,b 我们要分别确定唯一一个出边。
现在假设我们只选择最小的 \(j\) 满足 \(s_{[i+1,j]}\) 可以造出我们想要的字符 \(c\) 作为出边。
我们可能会想,\(f_n\) 应该就是答案,但是这会少算一些更短的串。

现在考虑前 \(i\) 个字符匹配完了得到一个串,现在要转移一个字符 \(c\)\(e_{i,c}\),然后接下来 \(s_{[e_{i,c}+1,k]}\)\(c\) 一起合并成 \(c\),最后一段后缀 \(s_{[k+1,n]}\) 接到我们匹配的串上。
考虑限制:

  • \(i+1\) 必须和 \(n\) 不在同一个 ababa... 连续段内。
  • \(e_{i,c}\) 不能是 \(n\),这部分在 \(f_n\) 被统计到了。
  • \(e_{i,c}<k\),如果相等是可以在 \(f_n\) 匹配到的。
  • \(s_{[e_{i,c}+1,k]}\) 这部分和是 0。

满足了上面的限制,现在分讨 \(k\)

  • \(k=n\):可以算入答案。
  • \(k<n\)\(e_{i,c}+1\)\(n\) 在同一个 ababa... 连续段内,可以算入答案。

总复杂度 \(O(n)\)

字符串匹配的一个做法是,\(\sum_{i=1}^{n} k_i(t_i-s_i)(t_i-p_{s_i})=0\),其中 \(k_i\) 是一个随机权值。
那么做差卷积即可:\(k_i(t_i-s_j)(t_i-p_{s_j}) \to F_{i-j}\)

posted @ 2026-04-29 15:29  TallBanana  阅读(17)  评论(0)    收藏  举报