AT_abc141_f

偶然找到的线性基好题。

考虑 s=xis=\bigoplus x_i,则此时 b=sab=s\oplus a,问题变为 max(a+(sa))\max(a+(s\oplus a))

然后观察 ss,有一个很典的想法是,ss00 的位上,aa 如果是 00 则会产生 00 的贡献,否则产生 22ss11 的位则稳定产生 11 的贡献,结合异或本质理解。

所以现在要求 xix_i 的一个子集的异或和中 ss 所有 00 的位组成的值的 max\max。这显然是一个线性基,具体实现是将所有 xx 按位与一个取反后的 ss,再插入线性基。

code:

int n,m;ll c[N];
struct XXJ{
	ll a[63];
	il void insert(ll x){
		drep(i,59,0){
			if(!(x>>i&1ll))continue;
			if(a[i])x^=a[i];
			else{a[i]=x;return;}
		}
	}
	il ll query(ll x){
		drep(i,59,0)if((x^a[i])>x)x=x^a[i];
		return x;
	}
}T;
void Yorushika(){
	scanf("%d",&n);
	ll sum=0;
	rep(i,1,n)scanf("%lld",&c[i]),sum^=c[i];
	rep(i,1,n)T.insert(c[i]&(~sum));
	printf("%lld\n",2*T.query(sum)-sum);
}
signed main(){
	int t=1;
	//	scanf("%d",&t);
	while(t--)
		Yorushika();
}