学一发线性基
首先可以发现
x1⊕x2=x
,
x
为所有元素的异或和
单独考虑
考虑用线性基,因为要x1+x2最大,所以越高位的x的为0的位要优先确定,改变下贪心顺序求满足条件的最大的x2就可以了
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
const int N=100010;
typedef long long ll;
int n;
ll ans,x,a[N];
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void rea(int &x){
char c=nc(); x=0;
for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}
inline void rea(ll &x){
char c=nc(); x=0;
for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}
struct LB{
ll a[65];
void insert(ll x,ll lim){
for(int i=60;~i;i--)
if((x>>i&1)&&!(lim>>i&1)){
if(a[i]) x^=a[i];
else{
a[i]=x; return;
}
}
for(int i=60;~i;i--)
if((x>>i&1)&&(lim>>i&1)){
if(a[i]) x^=a[i];
else{
a[i]=x; return ;
}
}
}
ll query(ll lim){
ll ret=0;
for(int i=60;~i;i--)
if(!(ret>>i&1)&&!(lim>>i&1)) ret^=a[i];
for(int i=60;~i;i--)
if(!(ret>>i&1)&&(lim>>i&1)) ret^=a[i];
return ret;
}
}L;
int main(){
rea(n);
for(int i=1;i<=n;i++) rea(a[i]),x^=a[i];
for(int i=1;i<=n;i++) L.insert(a[i],x);
printf("%lld\n",L.query(x)^x);
return 0;
}