Skip to content

Commit 3727648

Browse files
authored
Update Readme.md
1 parent d7dbc06 commit 3727648

File tree

1 file changed

+32
-4
lines changed
  • Math/3681.Maximum-XOR-of-Subsequences

1 file changed

+32
-4
lines changed

Math/3681.Maximum-XOR-of-Subsequences/Readme.md

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,36 @@ for (int b: basis) {
1515
接下来我们学习如何构造这样的异或空间线性基。举个例子:a=2, b=5, c=11, d=6
1616
```
1717
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
2222
```
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+

0 commit comments

Comments
 (0)