标签: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