1.原序列中任意一个数都可以由线性基里面的一些数异或得到;
2.线性基里面的任意一些数异或起来都不能得到0
3.线性基里面的个数唯一,并且保持在性质一的前提下,数的个数最少
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct L_B{
ll d[61],p[61];
ll cnt;
L_B()
{
memset(d,0,sizeof(d));
memset(p,0,sizeof(p));
cnt=0;
}
bool insert(ll val)//插入
{
for (ll i=60;i>=0;i--)
if (val&(1LL<<i))
{
if (!d[i])
{
d[i]=val;
break;
}
val^=d[i];
}
return val>0;
}
ll query_max()//取若干个数 求异或最大值
{
ll ret=0;
for (ll i=60;i>=0;i--)
if ((ret^d[i])>ret)
ret^=d[i];
return ret;
}
ll query_min()//取若干个数 求异或最小值
{
for (ll i=0;i<=60;i++)
if (d[i])
return d[i];
return 0;
}
void rebuild()//重构线性基
{
for (ll i=60;i>=0;i--)
for (ll j=i-1;j>=0;j--)
if (d[i]&(1LL<<j))
d[i]^=d[j];
for (ll i=0;i<=60;i++)
if (d[i])
p[cnt++]=d[i];
}
ll kthquery(ll k)//查询第 k 大,之前需要rebuild
{
ll ret=0;
if (k>=(1LL<<cnt))
return -1;
for (ll i=60;i>=0;i--)
if (k&(1LL<<i))
ret^=p[i];
return ret;
}
}lb;
L_B merge(const L_B &n1,const L_B &n2)//将线性基 n2 插入线形基 n1
{
L_B ret=n1;
for (ll i=60;i>=0;i--)
if (n2.d[i])
ret.insert(n1.d[i]);
return ret;
}
int main()
{
ll n,tp;
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&tp);
lb.insert(tp);
}
printf("%lld",lb.query_max());
return 0;
}