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 = smallegin{matrix} n \ overbrace{00cdots 0}end{matrix}) 要么含有 (t_2 = smallegin{matrix} n \ overbrace{11cdots 1}end{matrix})

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

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

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

原文地址:https://www.cnblogs.com/syksykCCC/p/CF1508A.html