線性基學習筆記

2022-05-18 11:51:19 字數 891 閱讀 9138

最近剛學習了乙個叫線性基的東西.

還是很有意思的.

線性基的性質

線性基有一些很妙的性質.

線性基的構造

插入乙個數\(x\)時,從最高位向最低位掃,如果這一位上線性基為空,那麼就插入.否則就讓\(x\)異或上這一位的數.

線性基求最大值

從高位往低位掃,如果異或上這一位使答案變大,那麼異或.

線性基判斷是否出現

從高位往低位掃,如果\(x\)這一位是\(1\),那麼異或上這一位.

線性基求第\(k\)小值

首先先重構一下線性基.

如果\(i的第\(i\)位是\(1\),那麼讓\(a_j\)異或上\(a_i\).

那麼只有\(a_i\)的第\(i\)位是\(1\),其他都是\(0\).

我們稱重構後的線性基為\(b\)

查詢時,如果\(k\)的第\(i\)位是\(1\),就異或上\(b_i\)

下面是封裝的線性基

struct lb 

void insert(ll x)

x^=a[i];

} if(!ins)flag=1;

} ll getmax()

bool exist(ll x)

void rebuild()

ll query_kth(ll k)

}s;

首先來幾道模板題

\(luogu3812\)

\(hdu3969\)

接下來是一道簡單題

\(bzoj2460\)

只要先按\(v\)從大到小排序,然後每次看看是否能插入\(num\),如果可以,答案就加上\(v\)即可.

接下來是一道稍難題

\(bzoj2115\)

詳細題解戳這裡

線性基學習筆記

線性基是幹嘛的呢?給定n個數,求所有數的異或和最大是多少?求解這類問題的時候,就需要線性基了 個人感覺線性基本身就一種貪心。首先定義ba se i bas e i 表示最高位1在i位的數是什麼 對於新進來的數tm p tmp 我們先找出他最高位上的1,假設為第 j j 位,然後看一下ba se j ...

線性基 學習筆記

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...