線性基大概可以理解為對於一組數 \(a_1,a_2...a_n\) ,構造出乙個大小為 \(\text\left(\log_2\text\right)\) 的乙個陣列 \(p\)(\(\text\) 即為陣列 \(a\) 中數的值域),使得陣列 \(a\) 中的任意數都可以由陣列 \(p\) 中的數異或得出。
在滿足此條件時,線性基的大小應該盡可能的小。
陣列能通過陣列 \(a\) 中的數異或得出的數同樣能夠通過陣列 \(p\) 中的數異或得出。
線性基中的每乙個數在二進位制形式下的最高位都不同。
線性基沒有異或和為 \(0\) 的子集。
設 \(p_i\) 為線性基中在二進位制下最高位為 \(i\) 的數的值
每插入乙個數 \(x\),就執行一遍下面的操作:
void build()
x^=p[i];
}}
如果找到了乙個沒有存入任何數的 \(p_i\),那麼把 \(x\) 存入後就可以直接表示出 \(x\)。
如果找到了乙個已經存入數的 \(p_i\),那麼只要線性基能表示出 \(x\ \oplus \ p_i\) 那麼 \(x\) 就可以通過 \(p_i\ \oplus\ \left(x\ \oplus\ p_i\right)=x\) 表示出。
而如果 \(x_\) 的第 \(i\) 位為 \(1\),那麼由於 \(p_i\) 的第 \(i\) 位一定為 \(1\) ,所以兩數異或後 \(x\) 的第 \(i\) 位一定為 \(0\),這樣一位一位地做,最終肯定會使 \(x\) 變為 \(0\)。
我們需要乙個大小 \(\text\left(\log_2\text\right)\) 的陣列來儲存所有的 \(p_i\),故空間複雜度 \(\text\left(\log_2\text\right)\)。
每插入乙個數要遍歷一邊 \(p\) 陣列,故時間複雜度也是 \(\text\left(\log_2\text\right)\)。
非常優秀
我們可以從高到低列舉位數 \(i\),記 \(ans\) 為當前能得到的異或最大值,則如果 \(p_i\ \oplus\ ans>ans\),那麼就令 \(ans=p_i\ \oplus\ ans\)。
因為 \(p_i\) 的第 \(i\) 位為 \(1\),如果 \(ans\) 的第 \(i\) 位為 \(0\),那麼異或後 \(ans\) 的第 \(i\) 為就變成了 \(1\),即使後面幾位再小,\(ans\) 也會變大,所以異或更優。
而如果 \(ans\) 的第 \(i\) 位為 \(1\),那麼異或後 \(ans\) 的第 \(i\) 為就變成了 \(0\),即使後面幾位再大, \(ans\) 也會變小,所以不異或更優。
因為是從高位到低位計算的,所以後面位數的計算不會影響前面位數的計算,所以是最優的。
code
int getmax()
最小值同理。
假如判斷的數是 \(x\) 那麼從高到低列舉 \(x\) 的每一位,如果第 \(i\) 位為 \(1\),那麼就把它異或上 \(p_i\),如果列舉完後 \(x\) 為 \(0\),那麼就可以表示出。
證明同理插入證明。
code
bool check(int x)
luogu p3812 【模板】線性基 解析
線性基求異或最大值的板子,不多說了
luogu p3857 [tjoi2008]彩燈 解析
開關就是乙個二進位制數,改變一次狀態就相當於異或,題目要求統計不同的數量,由於線性基中的每個元素不重複且可以表示出所有原陣列的異或值,所以直接把所有開關壓進線性基。由於線性基中每個數有選與不選兩種情況,所以統計線性基中數的個數 $sum$,答案就是 $2^$。
luogu p4570 [bjwc2011]元素 解析
注意到異或存在 $a \ \oplus\ b=c$ 時則 $b \ \oplus\ c=a$ 的性質,所以如果選擇乙個元素 $x$ 時出現了和已選中元素的非空子集 $a$ 異或為 $0$ 的情況,即:$a_ \ \oplus\ ...\ \oplus\ a_=x$,則子集中任意乙個數和 $x$ 互換後異或和也是 $0$,例如把 $x$ 和 $a_$ 互換後即為 $x \ \oplus\ ...\ \oplus\ a_=a_$。
換句話說,如果乙個元素 \(x\) 可以通過選中的元素表示出,則它一定和選中的元素中的某乙個互換後仍然是滿足要求的。所以我們只要盡可能地選價值更大的就一定是最優的。所以可以先按價值排序,從大到小選。判斷異或和相等則直接套上乙個線性基就行了。
atcoder abc141f xor sum 3 解析
有趣的思維題。按位考慮,如果序列 $a$ 中一位出現的次數是奇數,那麼怎麼分其對答案都只貢獻一次。把所有出現次數為奇數的位刨掉,剩下的位置出現次數就都是偶數,那麼顯然這樣分出來的兩個集合的值相等,所以最大化其中乙個即可。
待更新。。。
線性基學習小記
這玩意以前聽說過,然鵝一直木有學。現在遇到題目要搞線性基了,然後就怒補了一番。其實任何證明都不知道,只會感性理解 就記記結論好了。多項式全家桶一邊呆著去 首先學習過線性代數的同學可能對基這個概念比較了解。好吧,其實基就可以理解成乙個座標系的x軸y軸之類的。而線性基則在oi界中的定義大為不同,它的基不...
模板 線性基
難度較大,請勿棄療 給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。n 50sample input33 21sample output 3看上去莫名其妙地想貪心。給些定義 s 為無符號整數集 即s n 記為 xor sum s x or s um s s1 s2 s s ...
模板 線性基
給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。線性基模板可解決 將n個整數看做集合a 線性基即為集合a的子集 線性基中每個元素的異或方案唯一,也就是說,線性基中不同的異或組合異或出的數都是不一樣的。線性基的二進位制最高位互不相同。這樣我們先構造出線性基 然後貪心的去搞最大...