luogu 3812 【模板】 线性基

线性基是一个支持在集合里插入数并查询最大子集异或值

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #include<set>
11 #define ll long long
12 #define db double
13 #define inf 2139062143
14 #define MAXN 100100
15 #define MOD 998244353
16 #define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
17 #define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
18 #define ren for(register int i=fst[x];i;i=nxt[i])
19 #define pb(i,x) vec[i].push_back(x)
20 #define pls(a,b) (a+b)%MOD
21 #define mns(a,b) (a-b+MOD)%MOD
22 #define mul(a,b) (1LL*(a)*(b))%MOD
23 using namespace std;
24 inline ll read()
25 {
26     ll x=0,f=1;char ch=getchar();
27     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
28     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
29     return x*f;
30 }
31 ll p[70];int n,m;
32 void ins(ll x) {dwn(i,63,0) if(x>>i&1LL) {if(!p[i]) {p[i]=x;break;}x^=p[i];}}
33 ll query(ll res=0) {dwn(i,63,0) res=max(res,res^p[i]);return res;}
34 int main()
35 {
36     n=read();rep(i,1,n) ins(read());printf("%lld\n",query());
37 }
View Code

 

posted @ 2019-04-18 17:29  jack_yyc  阅读(176)  评论(0编辑  收藏  举报