题意:给定N个数,Q次询问,求区间最大异或和。
我们纪录一个前缀和 线性基,保留最大的位置。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e6+4;
int pos[maxn][33],base[maxn][33],ps[33],bs[33];
void add(int x,int id){
for(int i=20;i>=0;i--){
if(x&(1<<i)){
if(!bs[i]){
bs[i] = x;
ps[i] = id;
break;
}
if(ps[i]<id){
swap(ps[i],id);
swap(x,bs[i]);
}
x^=bs[i];
}
}
}
int main()
{
int x,n,m;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&x);
add(x,i);
for(int j=20;j>=0;j--){
pos[i][j] = ps[j]; base[i][j] = bs[j];
}
}
scanf("%d",&m);
int l,r,ans;
for(int i=1;i<=m;i++){
ans = 0;
scanf("%d %d",&l,&r);
for(int j=20;j>=0;j--){
if(pos[r][j]>=l&&((ans^base[r][j])>ans)){
ans^=base[r][j];
}
}
printf("%d\n",ans);
}
return 0;
}