标签:cto mes cond mod ++ include size set return
集合选数异求最大异或和当然是用线性基做,可惜它不兹磁删除
所以线段树分治一下就好了
#include<stdio.h>
#include<vector>
#include<map>
#include<string.h>
using namespace std;
struct lb{
int a[32];
lb(){memset(a,0,sizeof(a));}
void insert(int v){
int i;
for(i=31;i>=0;i--){
if(v>>i&1){
if(a[i]==0){
a[i]=v;
return;
}
v^=a[i];
}
}
}
int query(){
int res,i;
res=0;
for(i=31;i>=0;i--)res=max(res,res^a[i]);
return res;
}
};
vector<int>t[2000010];
vector<int>::iterator vi;
void modify(int L,int R,int v,int l,int r,int x){
if(L<=l&&r<=R)return t[x].push_back(v);
int mid=(l+r)>>1;
if(L<=mid)modify(L,R,v,l,mid,x<<1);
if(mid<R)modify(L,R,v,mid+1,r,x<<1|1);
}
void query(lb b,int l,int r,int x){
for(vi=t[x].begin();vi!=t[x].end();vi++)b.insert(*vi);
if(l==r){
printf("%d\n",b.query());
return;
}
int mid=(l+r)>>1;
query(b,l,mid,x<<1);
query(b,mid+1,r,x<<1|1);
}
map<int,int>las;
map<int,int>::iterator it;
int main(){
int n,i,x;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&x);
if(x<0){
modify(las[-x],i-1,-x,1,n,1);
las[-x]=0;
}else
las[x]=i;
}
for(it=las.begin();it!=las.end();it++){
if(it->second)modify(it->second,n,it->first,1,n,1);
}
query(lb(),1,n,1);
}
标签:cto mes cond mod ++ include size set return
原文地址:https://www.cnblogs.com/jefflyy/p/8893674.html