- “交换”其实是一个很抽象的操作
- 因为你并不关心“交换”这个操作本身,而只关心它产生的影响
- 考虑把“交换”具像化。它等价于将f(a)、f(b)同时异或上(ai^bi)
- 引入线性基算法,问题解决
- 其实你已经感受到了这种类似于“自动机”的感觉,也想到了线性基算法,但,对什么序列构建异或空间呢?a和b当然不行,因为你并不关心孤立的个体,而只关心它们联系产生的整体——ai^bi
- 当你重新审视一道题目时,应当抛却最初的想法(按位考虑),这样,灵感火花才有迸发的空间
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[1000005],b[1000005],c[1000005];
int val[31];
void insert(int x)
{
for(int i=30;i>=0;i--)
{
if(((x>>i)&1)==1)
{
if(val[i]==0)
{
val[i]=x;
return;
}
else
{
x^=val[i];
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
memset(val,0,sizeof(val));
int n,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum^=a[i];
}
int tot=0;
for(int i=1;i<=n;i++)
{
cin>>b[i];
c[i]=(a[i]^b[i]);
insert(c[i]);
tot^=c[i];
}
int x=sum;
for(int i=30;i>=0;i--)
{
if(max(x^val[i],x^val[i]^tot)<max(x,x^tot))
{
x^=val[i];
}
}
cout<<max(x,x^tot)<<endl;
}
return 0;
}