字符串专题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)\)。
CF1334G Substring Search
字符串匹配的一个做法是,\(\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}\)。
浙公网安备 33010602011771号