前言:
这两道题,其实是一道题,几乎没有什么区别。
题目(4163. 【NOI2015模拟WWX】求同)
:求同,字面意思就是寻求共同之处。这道题目就与此相关。简而言之,问题是这样的,给出n个非负整数a1..an,要求2个正整数数集S和T,使得S和T中的所有元素都在[1,n]之间,且S和T的交集为空,S和T的并集大小为n。 那么这里的求同具体来说就是指:设S中所有元素对应的a中数值按位异或的值为X,T中所有元素对应的a中数值按位异或的值为Y,使X和Y按位与的值尽量大。
题解
设ans=X and Y,sum=X xor Y,注意到sum的值是不变的,我们只要确定了X,Y就确定了。那么我们想对于sum某一位0的位,我们是不是尽量想让X的这一位为1(如果X这位为1,那么Y的这一位也为1,只有这样对ans才会有贡献),假如我们现在对于sum的某一位为0,那么这一位肯定有偶数个一,那么我们是不是应该尽量的将他们分开两组,且每组1的个数都是奇数。我们可以列出一条方程:
ak:x1v1xorx2v2......xorxnvn=0/1
a
k
:
x
1
v
1
x
o
r
x
2
v
2
.
.
.
.
.
.
x
o
r
x
n
v
n
=
0
/
1
如果xi表示第i个数是否在第一组,vi表示第i个数二进制下第k位的值,0/1,表示sum这一位否./是为0,解方程即可。
至于CF那道题,大家可以去YxuanwKeith的博客的博客里找。