字符串专题
https://cplusoj.com/d/senior/contest/69e5b7881363e1a076adfbd8/
CF204E Little Elephant and Strings
GSAM,启发式合并处理在哪些字符串中出现过即可吧。
P6698 [BalticOI 2020] 病毒 (Day2)
标注一下数据范围:\(|\Sigma|-2\le n \le 100,m \le 50\)。
先给所有 01 串建立 AC 自动机。
那么考虑每个基因 \(i\),如果初始的 01 串节点为 \(u\),将 \(i\) 替换为一段 01 串后,使得最后得到的 01 串节点为 \(v\),设其最短路为 \(e_{i,u,v}\)。
显然可能存在环,但是可以类似 bellman ford 迭代 \(n+m\) 次,这样最后最短路就是对的了。
复杂度 \(O(n^2m^3)\),到底为什么能过啊。
AT_agc022_e [AGC022E] Median Replace
如果有 000,那么操作他一定是不劣的。最后操作 111 一定是不劣的。
011 和 001 都是一换一。
那么先缩 000 和 010,这样 1 连续段一定至少为 2。这样缩完后 1 比 0 多就是合法的充要条件。
根据上述讨论,我们可以维护一个栈:
- 加入 0 时:
- 如果栈顶是 00,那么弹出一个 0。
- 否则加入一个 0。
- 加入 1 时:
- 如果栈顶是 0,那么弹出栈顶,因为 011 和 010 都是可以直接操作的。
- 如果栈顶是 11,那么这个 1 可以忽略,最后操作所有的 111。
- 否则加入一个 1。
显然栈一定是 0 在 1 上面,且个数都不会超过 2。
AT_agc024_f [AGC024F] Simple Subsequence Problem
设状态 \(f_{A,B}\) 表示目前匹配的子序列为 \(A\),现在要在 \(B\) 中找到下一个出边,有多少个串是可以满足这个条件的。
初始状态 \(f_{\varnothing,S_i}=1\),最后对于可以成为答案的串满足 \(f_{ans,\varnothing}\ge k\)。
由于 \(|A|+|B|\le n\),可以做到 \(O(2^nn)\) 复杂度。
浙公网安备 33010602011771号