**:
若干數的線性基是一組數a1
,a2,
...a
n ,其中ax
的最高位的1在第x位。
通過線性基中元素xor出的數的值域與原來的數xor出數的值域相同。
對每乙個數p從高位到低位掃,掃到第x位為1時,若ax
不存在,則ax
=p並結束此數的掃瞄,否則令p=
pxor
ax。用線性基求這組數xor出的最大值:從高往低掃ax
,若異或上ax
使答案變大,則異或。
用線性基求乙個數能否被xor出:從高到低,對該數每個是1的位置x,將這個數異或上ax(注意異或後這個數為1的位置和原數就不一樣了),若最終變為0,則可被異或出。當然需要特判0(在構造過程中看是否有p變為0即可)。例子:(11111,10001)的線性基是a5
=11111,a4
=01110,要判斷11111能否被xor出,11111 xor a5
=0,則這個數後來就沒有是1的位置了,最終得到結果為0,說明11111能被xor出。
個人談一談對線性基的理解:
很多情況下,只有有關異或運算和求最值,就可以用到線性基。線性基有很多很好的性質,比如說如果有很多個數,我們可以構出這些數的線性基,那麼這個線性基可以通過互相xor,能夠構出原來的數可以相互xor構出的所有的數。所以可以大大減少判斷的時間和次數。同時線性基的任何乙個非空子集都不會使得其xor和為0,證明也很簡單,反證法就可以說明。這個性質在很多題目中可以保證演算法合法性,比如:bzoj2460。
構造的方法有點像貪心,從大到小保證高位更大。也比較好理解。就是這幾行**:
for(int i=1;i<=n;i++)//選入線性基中
a[i]^=p[j];
}}
可以把n個數變成只有最大的數的二進位制位數那麼多個數,這就是線性基的優秀之處。
查詢的話,也是乙個貪心思想,如果可以使得ans
更大,就把這一位的基xor進ans。
for(int i=62;i>=0;i--)
這就是線性基的基本用法和個人的一些理解。 我關於的線性基簡單理解
線性基 線性基是一種特殊的基,它通常會在異或運算 現,它的意義是 通過原集合s的某乙個最小子集s1使得s1內元素相互異或得到的值域與原集合s相互異或得到的值域相同。線性基有三個性質 1 原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到。2 線性基裡面的任意一些數異或起來都不能得到0 3 線性...
線性基學習
除了xor b不存在異或為0的結果外,xor a和xor b可以說是相等的。結果是相同的,但壓縮了空間,除此外線性基還有很多比較方便的性質。到題目裡細講 講的不是很嚴謹,大意是這樣。更詳細可以看這裡 線性基模板以及講解然後開始刷題。1.bzoj2460 題意 給n塊石頭,石頭有兩個屬性標號id和魔法...
線性基學習
線性基是乙個數的集合,並且每個序列都擁有至少乙個線性基,取線性基中若干個數異或起來可以得到原序列中的任何乙個數。原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到 線性基裡面的任意一些數異或起來都不能得到 0 線性基裡面的數的個數唯一,並且在保持性質一的前提下,數的個數是最少的 線性基中每個元...