线性基

风流意气都作罢 提交于 2019-11-27 07:30:39

•参考资料

[1]:算法 | 线性基学习笔记
[
2]:线性基学习笔记

•习题

•模板

 1 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));
View Code

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!