D. Dr. Evil Underscores
给出n个数a[1]~a[n],用一个数x,令x xor a[i]的最大值最小,求这个最小值。 异或这个运算是每一位都独立运行的,显然,这题和二进制有关,所以我们应该把他们拆分成二进制来观察得出规律。显然如果某一位二进制上全是相同的0或者1,x相应的位置上应该和他们相同,这样肯定可以让最后的值变小。关键是有0有1怎么处理,刚开始我是想有0有1,这一位x无论是0还是1对最后答案的贡献都是1,然后直接当1处理就好了,然后继续处理剩下的位数。 实际上这是有问题的,前半句话是对的,但是,虽然无论当前这位选择0还是1最后对答案的贡献都是当前位变成1,但是选择1还是0会导致一部分的数字后面的位数不再产生有效的贡献。举个例子: 00110 01001 01101 10111 11001 11011 如果x第一位选择0异或之后(暂时不管x后面几位)就变成 0 * * * * 0 * * * * 0 * * * * 1 * * * * 1 * * * * 1 * * * * 显然后三个一定大于前三个,无论*代表什么数,所以只有后面三个数才具备继续讨论的必要,前三个数不可能是最大值,对答案也就没有贡献了。如果第一位选择1异或那么结果刚好相反。 所以问题到这里就很清晰了,按照二进制从左往右遍历,如果全是0或者1,当前位+0继续向下一位求解,如果有0有1,按照当前位是0还是1分成两个集合,分别求解子集合