線性基學習筆記

2021-08-20 16:14:17 字數 1249 閱讀 1489

線性基是幹嘛的呢?

給定n個數,求所有數的異或和最大是多少?

求解這類問題的時候,就需要線性基了

個人感覺線性基本身就一種貪心。

首先定義ba

se[i

] bas

e[i]

表示最高位1在i位的數是什麼

對於新進來的數tm

p tmp

,我們先找出他最高位上的1,假設為第

j j

位,然後看一下ba

se[j

]' role="presentation" style="position: relative;">bas

e[j]

base

[j]有沒有數,如果沒有,直接將它賦值成tm

p tmp

,如果有,那就tm

p=ba

se[j

] tmp

=bas

e[j]

就有點像高斯消元 對,把tm

p tmp

這位的1消去(或者說,這個數去掉這位1之後,還能對哪些ba

seb as

e作貢獻),那麼我們考慮,經過這個處理,tm

p tmp

要麼被加入了base,要麼變成了0(就是他可以被之前的數異或得到)求m

axm ax

的時候,我們就貪心即可

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline ll read()

while (isdigit(ch))

return x*f;

}ll n,tmp;

ll base[110];

int main()

tmp^=base[j];}}

} ll ans=0;

for (int i=63;i>=0;i--)

cout

0;}

這裡補充乙個線性基的性質

1>同時線性基的任何乙個非空子集都不會使得其xo

r xor

和為02>果有很多個數,我們可以構出這些數的線性基,那麼這個線性基可以通過互相xor,能夠構出原來的數可以相互xor構出的所有的數。就可以減少判斷的時間和次數。

線性基 學習筆記

includeusing namespace std using ll long long const int maxn 5e5 5 原來的數 const int maxbit 63 ll a maxn 原來的數 ll p maxbit p j 第j位為最高位1的數 最高位1在第j位的數 int m...

線性基 學習筆記

按位計算,如果相同記為0,不同記為1。如果,a b c,c b a 交換律結合律 對於任何數,x x 0,x 0 x 對 於一 段序列a n,異或 和為a1 a2 an 對於一段序列a n,異或和為a 1 a 2 a n 對於一段序列 an 異或和為 a1 a2 an 設t s,所有 這樣的子 集t...

線性基學習筆記

線性基是乙個數的集 合數的集合 數的集合 並且每個序列都擁有至少一 個線性基 至少乙個線性基 至少乙個線性 基,取線性基中若干個數異或起來可以得到原序列中的任何乙個數。1.原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到 2.線性基裡面的任意一些數異或起來都不能得到0 3.線性基裡面的數的個...