關於線性基的學習與理解

2021-07-27 14:29:26 字數 1079 閱讀 4435

**:

若干數的線性基是一組數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 線性基裡面的數的個數唯一,並且在保持性質一的前提下,數的個數是最少的 線性基中每個元...