字符串总结

未完待续


要记得有个东西叫哈希!

常用套路

一(基本根号结论)

给定 \(n\) 个字符串 \(s_1,\dots,s_n\),保证 \(\sum\limits_{i=1}^n|s_i|\le L\),则 \(s_i\) 长度只有 \(\mathcal{O}(\sqrt{L})\) 种。

证明:去重显然不劣,不重时最优取法为 \(|s_i|=i\),只能构造出 \(\mathcal{O}(\sqrt{L})\) 个串。

二(ACAM 上根号结论)

给定 \(n\) 个字符串 \(s_1,\dots,s_n\),保证 \(\sum\limits_{i=1}^n|s_i|\le L\)。则用它们建 AC 自动机,称字符串结尾点是关键点,所有点 fail 树上关键祖先数量总和 \(\mathcal{O}(L\sqrt{L})\)。

对于每个关键点,其对应原串长度 \(\ge\) fail 树上深度(因为每向上跳一次长度至少 \(-1\)),用上一条类似证明,最多只有 \(\mathcal{O}(\sqrt{L})\) 层有关键点,每一层有 \(\le L\) 次贡献,总贡献 \(\mathcal{O}(L\sqrt{L})\)。

括号序列问题

括号匹配问题,可以考虑对每组匹配单独考虑,以及把 (,) 分别视为 \(+1,-1\) 则前缀和 \(\ge 0\) 且总和 \(=0\)。

最长匹配子序列(LPS)

直接贪心,能放就放,不能放跳过。

证明考虑调整法,假设有一个最优解 \(P\) 和贪心构造 \(Q\) 不一样,找到第一个不一样的位置:若 \(P\) 有 \(Q\) 没有,这与贪心矛盾;若 \(P\) 没有 \(Q\) 有,且当前位置是 (,则把 \(P\) 的下一个 ( 放过来,一定不劣;若当前位置是 ),则把 \(P\) 的下一个 ) 调过来也一定合法。不断调整,最终 \(P=Q\)。

单点修改使括号序列合法

例题:CF2196D

每次可以单点修改括号序列,求最少操作次数使括号序列合法。

法一:直接贪

与求 LPS 过程类似,贪心,如果放入一个 ) 后不匹配,则把 ) 改为 (,最后得到一堆 (,给答案加上 ( 数量除以 \(2\) 即可。

做法很简洁,但是证明我只会转化为法二,在不合法的位置把 ) 改为 ( 以及调整最后的一串 ( 相当于把去掉 LPS 后的 ))...))((...(( 调为匹配。

*法二:高级且严谨的做法

对每对匹配单独考虑,把序列划分为若干二元组,每个二元组需要 \(0/1/2\) 次操作变为合法,而不难发现一堆 () 任意交错组合都是合法的。

先最大化 \(0\) 次操作二元组数量,发现去掉的部分构成匹配子序列,最长的相当于 LPS,直接找到并去掉。最大化 \(0\) 次操作二元组数量一定不劣,因为长 \(n\) 的序列只用 \(1/2\) 次操作二元组划分答案为 \(\frac{n}2\sim\frac{n}2+1\),去掉一个 \(0\) 次操作二元组后答案变为 \(\frac{n}2-1\sim\frac{n}2\)。

于是得到 \(s'=\)))...))((...((,所有 )) 和 (( 都只需要 \(1\) 次操作,出现 )( 当且仅当两边 ) 和 ( 的数量均为奇数,特判并 \(+1\) 即可,答案为 \(\frac{|s'|}2\) 或 \(\frac{|s'|}2+1\)。

posted @ 2026-01-04 20:45  SmpaelFx  阅读(21)  评论(0)    收藏  举报