字符串专题

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)\) 复杂度。

P6292 区间本质不同子串个数

不想再写一遍啦。
https://www.cnblogs.com/TalBana/p/19360157

posted @ 2026-04-21 10:25  TallBanana  阅读(22)  评论(0)    收藏  举报