题目中给出了一个引理:将长度为 \(n\) 的所有 \(2^n\) 个 01
串分成两个集合 \(A,B\),则 \(A\) 与 \(B\) 中相似字符串(即只有一位不同的字符串)的对数不小于 \(\min\{A,B\}\)。
翻遍各大网站也没找到该引理的证明,这不禁令人思来想去,寝食难安。
在进行了漫长的思考之后,笔者似乎找到了一种证明方法,记录在此,供大家讨论。
证明:
对 \(n\) 进行归纳,稍加讨论可以发现当 \(n\le 2\) 时结论成立。如果对 \(n(n\ge 2)\) 结论成立,那么对 \(n+1\):
将 01
串按第一个字符为 0
还是 1
,字符 1
的个数为偶数还是奇数分为四类:\(U_{0,0},U_{0,1},U_{1,0},U_{1,1}\),其中 \(U\) 的第一个下标表示第一个字符为 0
还是 1
,第二个下标表示字符 1
的个数为偶数(\(0\))还是奇数(\(1\))。
再记 \(S_{u,v}=A\cap U_{u,v}\),\(T_{u,v}=U_{u,v}\setminus S_{u,v}\),其中 \(u,v\in \{0,1\}\)。
不妨设 \(|S_{0,0}|+|S_{0,1}|\le |T_{0,0}|+|T_{0,1}|\),否则交换 \(A,B\)。于是分为两类情况:
- \(|S_{1,0}|+|S_{1,1}|\le |T_{1,0}|+|T_{1,1}|\)
记 \(A_0=S_{0,0}\cup S_{0,1}\),\(B_0=T_{0,0}\cup T_{0,1}\),由归纳 \(A_0\) 与 \(B_0\) 间的贡献不小于 \(\min\{|A_0|,|B_0|\}=|A_0|\)。 \(A_1=S_{1,0}\cup S_{1,1}\) 与 \(B_1=T_{1,0}\cup T_{1,1}\) 的贡献情况同理,于是总贡献不小于 \(|A_0|+|A_1|=|A|\),证毕。
- \(S_{1,0}+S_{1,1}\ge T_{1,0}+T_{1,1}\)
由情况 \(1\) 已有贡献不小于 \(|A_0|+|B_1|\)。
再设 \(|S_{0,0}|=2^{n-2}+a\),\(|S_{0,1}|=2^{n-2}+b\),\(|S_{1,0}|=2^{n-2}+c\),\(|S_{1,1}|=2^{n-2}+d\),有 \(-2^{n-2}\le a,b,c,d\le 2^{n-2}\),同时 \(T_{0,0}=2^{n-2}-a,T_{0,1}=\cdots\)
再统计 \(S_{u,v}\) 与 \(T_{u \operatorname{xor} 1,v \operatorname{xor} 1}\) 的贡献,可以发现 \(S_{0,0}\) 与 \(T_{1,1 }\) 的贡献不小于 \(\max\{a-d,0\}\),故四组贡献之和不小于 \(\max\{a-d,0\}+\max\{b-c,0\}+\max\{c-b,0\}+\max\{d-a,0\}=|d-a|+|c-b|\ge c+d-a-b\)。
同时 \(|A_0|+|B_1|+c+d-a-b= 2^n\),必定不小于 \(A,B\) 中的较小者,证毕。
由此对所有非负整数 \(n\) 结论成立。
顺便一提之后的做法:
首先有暴力,从 \(s\) 开始搜索看是否能搜到 \(t\),如果搜到则有解,如果搜不到则则无解。
对于搜不到的情况,将点集分为已遍历过的点集 \(A\) 与未遍历的点集 \(B\) 进行观察,未遍历点集 \(B\) 有至多 \(k\) 个点与 \(A\) 有连边,因而 \(A,B\) 间有至多 \(nk\) 条边,从而 \(\min\{|A|,|B|\}\le nk\),也即如果无解必然有一个连通块大小不超过 \(nk\),那么只需要从 \(s\) 与 \(t\) 分别出发各找一次是否存在大小不超过 \(nk\) 的连通块即可。时间复杂度 \(O(n^2k)\),实现优秀即可通过。
应该说删去这个提示题目会难很多(找出这个性质与证明都十分艰辛),但或许这正是应用数学的魅力所在吧。