這裡指oi裡的線性基,用來解決與異或相關的問題。
線性基是乙個整數集合對應的乙個集合,其異或值域與原序列完全相同(不多不少)。所謂異或值域,就是在集合中選擇任意子集的異或和的所有取值。這樣一來,就異或和意義下,這兩個集合就完全等效了。
異或的性質
交換律:$a \oplus b = b \oplus a$
結合律:$a \oplus (b \oplus c) = (a \oplus b) \oplus c$
自反性:$a \oplus a = 0$
異或可以理解為返回某兩位是否不同,或者理解為不進製的加法。
構造線性基
線性基內的元素一旦確定就不會修改了。
inline void insert(intx) x ^=basis[i];
if(!x) break
; }
}}
最大值要求乙個集合裡元素的最大異或和,那麼先建線性基。
線性基值域的最大值怎麼求?從最高位到最低位貪心。先將$ans$設為0,然後從高到低去異或線性基里的元素。如果當前位是1那肯定要選,這個沒問題,$ans= ans \oplus basis_i$;如果當前位是0呢?那就如果$ans \oplus basis_i > ans$則異或。因為無論如何第$i$位不能變成1,那麼就先設法保證後面能更大。如果到了後面能把一位從0變成1,那肯定會去做;反之如果後面沒這個能力,而卻通過這一步使0變成1了,那肯定更優了。
值域大小
線性基學習筆記
線性基是幹嘛的呢?給定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...