模板第四弹
难度较大,请勿弃疗
给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。
n<=50
Sample Input
3
3 2 1
Sample Output
3
看上去莫名其妙地想贪心。。。
给些定义:
S
为无符号整数集
即
异或和
记为
Xor−Sum(S)
Xor−Sum(S)=S1⊕S2⊕....⊕S|S|
张成
记为
span(S)
对于所有
T∈S
,有
Xor−Sum(T)∈span(S)
就是所有子集异或和的集合
前方高能!!!
线性相关
S
若有元素
Sj∈span(S′)
则称
S
线性相关,否则称
前方高能!!!*2+重点!!!
线性基
若
B
为
B
满足
1.
2.
B
线性无关
线性基的长度为
前方高能!!!*3+重点!!!*2
构造与性质
我们设
Smax
为
S
中最大的元素
设
我们可用一个数组
g[Len]
的数组存储线性基
对于每个
i,gi
只有两种可能:
1.
gi=0
所有
j
使
2.
gi≠0
所有
j
使
所有
j
使
所有
j
使
假设插入数位
x
<script type="math/tex" id="MathJax-Element-49">x</script>
流程参考代码
void insert(ll x)
{
fd(i,len-1,0)
if(x&(1ll<<i))
if(g[i])
x^=g[i];
else
{
fr(j,0,i-1)
if(x&(1ll<<j))
x^=g[j];
fr(j,i+1,len-1)
if(g[j]&(1ll<<i))
g[j]^=x;
g[i]=x;
return ;
}
}
开始的问题
看了代码,你也许会大呼简单
前面当然要加上插入啊
ll ans=0;
fr(i,0,len-1)
ans^=g[i];