File tree Expand file tree Collapse file tree 1 file changed +32
-4
lines changed
Math/3681.Maximum-XOR-of-Subsequences Expand file tree Collapse file tree 1 file changed +32
-4
lines changed Original file line number Diff line number Diff line change @@ -15,8 +15,36 @@ for (int b: basis) {
15
15
接下来我们学习如何构造这样的异或空间线性基。举个例子:a=2, b=5, c=11, d=6
16
16
```
17
17
3 2 1 0
18
- a
19
- b
20
- c
21
- d
18
+ a 0 0 1 0
19
+ b 0 1 0 1
20
+ c 1 0 1 1
21
+ d 0 1 1 0
22
22
```
23
+ 首先考察a=0010,最高位在第1位,且我们还没有最高位在第1位的基存在,所以我们可以确定一个最高位在第1位的基:b(1) = 0010.
24
+
25
+ 接着考察b=0101,最高位在第2位,且我们还没有最高位在第2位的基存在,所以我们可以确定一个最高位在第2位的基:b(2) = 0101.
26
+
27
+ 然后考察c=1011,最高位在第3位,且我们还没有最高位在第3位的基存在,所以我们可以确定一个最高位在第3位的基:b(3) = 1011.
28
+
29
+ 最后考察d=0110,最高位在第2位,我们已经确定了b(2),所以我们与b(2)结合` d^b(2) = 0110^0101 = 0011 ` 。它的最高位在第1位,而我们已经确定了b(1),我们就再与b(1)结合` 0011^0010=0001 ` ,此时它的最高位在第0位,且我们还没有最高位在第0位的基存在,所以我们可以确定一个最高位在第0位的基:b(3) = 0001.
30
+
31
+ 综上,我们得到了一组线性基` b(3)=11, b(2)=5, b(1)=2, b(0)=1 ` .
32
+
33
+ 以上的算法总结成代码模板就是:
34
+ ``` cpp
35
+ vector<int >basis (32, 0);
36
+ for (int x: nums) {
37
+ for (int i=31; i>=0; i--) {
38
+ if (!(x>>i)&1) continue;
39
+ if (!basis[ i] ) {
40
+ basis[ i] = x;
41
+ break;
42
+ }
43
+ x ^= basis[ i] ;
44
+ }
45
+ }
46
+ ```
47
+
48
+
49
+
50
+
You can’t perform that action at this time.
0 commit comments