•参考资料
[1]:算法 | 线性基学习笔记
[2]:线性基学习笔记
•习题
- 洛谷P3812 【模板】线性基 (求最大)
牛客xor序列 (查找)
- 洛谷P4570 [BJWC2011]元素 (插入/查找 线性基不为0)
- 洛谷P4301 [CQOI2013]新Nim游戏 (插入/查找 线性基不为0)
- 洛谷P3265 [JLOI2015]装备购买 (实数线性基)
- hdu3494 XOR (第k大)
•模板
View Code1 ll n; 2 ll p[65]; 3 4 ///插入 5 void Insert(ll x) 6 { 7 for(int i=60;i>=0;i--) 8 { 9 if(x&(1ll<<i)) 10 { 11 if(!p[i]) 12 { 13 p[i]=x; 14 break; 15 } 16 x^=p[i]; 17 } 18 } 19 } 20 21 22 ///查找 23 bool Find(ll x) 24 { 25 for(int i=60;i>=0;i--) 26 { 27 if(x&(1ll<<i)) 28 { 29 if(!p[i]) 30 { 31 p[i]=x; 32 return true; 33 } 34 x^=p[i]; 35 } 36 } 37 return false; 38 } 39 40 41 ///最大值 42 ll get_Max() 43 { 44 ll ans=0; 45 for(int i=60;i>=0;i--) 46 if(x&(1ll<<i)) 47 ans=max(ans,ans^p[i]); 48 49 return ans; 50 } 51 52 53 ///最小值 54 ll get_Min() 55 { 56 for(int i=0;i<=60;i++) 57 if(p[i]) 58 return p[i]; 59 } 60 61 62 ///第k大 63 ll cnt=0; 64 ll th[65]; 65 void rebuild() 66 { 67 for(int i=60;i>=0;i--) 68 for(int j=i-1;j>=0;j--) 69 if(p[i]&(1ll<<j)) 70 p[i]^=p[j]; 71 72 for(int i=0;i<=60;i++) 73 if(p[i]) 74 th[cnt++]=p[i]; 75 } 76 ll kthquery(ll x) 77 { 78 if (x>=(1ll<<cnt)) 79 return -1; 80 ll ans=0; 81 for(ll j=60;j>=0;j--) 82 if ((x&1ll<<j)) 83 ans^=th[j]; 84 85 return ans; 86 } 87 88 ///在求第k大时里面是包括 0 的 89 ///但是并不是所有的都可以异或出来 0 90 ///如果构造出来的线性基有 k 位不为 1 91 ///那么说明每个数都提供了 1,则说明不会异或出 0 ,否则可以。 92 if(cnt!=n) 93 x--; 94 printf("%lld\n", kthquery(x));