Codeforces 1508A Binary Literature

考虑着重关注两个 \(0/1\) 字符串 \(s_1, s_2\),构造一个 \(S\) 同时含有 \(s_1, s_2\) 作为子序列,那么 \(|S|\) 至少应该是多少呢?

答案显然是 \(|s_1| + |s_2| - |\operatorname{LCS}(s_1, s_2)|\)

但是通常求 \(\operatorname{LCS}\)\(O(n^2)\) 的 DP,这里显然行不通,但考虑到这里是 \(0/1\) 字符串,而且并不是一定要最小化长度,只要满足一定限制即可,所以有没有改进方法呢?

对于任意长度为 \(2n\)\(0/1\) 字符串 \(s\),其中必然有至少 \(n\)\(0\) 或者至少 \(n\)\(1\)

这个结论的正确性是非常显然的,它的另一种表述形式是,每个 \(s_i\) 要么含有 \(t_1 = \small\begin{matrix} n \\ \overbrace{00\cdots 0}\end{matrix}\) 要么含有 \(t_2 = \small\begin{matrix} n \\ \overbrace{11\cdots 1}\end{matrix}\)

而本题中又给定了 \(3\) 个字符串,所以必然有两个字符串所含的 \(t\) 是相同的。

于是必然可以构造出一种 \(2n+2n - n = 3n\) 的合法方案。

构造过程中,只要把 \(s_1, s_2\) 中对应的字符插到 \(t\) 的对应位置中即可。

posted @ 2021-04-22 00:13  syksykCCC  阅读(99)  评论(0编辑  收藏  举报