線性基講解

2021-08-19 01:16:44 字數 2052 閱讀 1844

1、線性基:

若干數的線性基是一組數a1

,a2,

...a

na1,a2,...an

,其中axax

的最高位的11

在第xx位。

通過線性基中元素xo

rxor

出的數的值域與原來的數xo

rxor

出數的值域相同。

2、線性基的構造法:

對每乙個數pp

從高位到低位掃,掃到第xx

位為11時,若ax

ax不存在,則ax

=pax=p

並結束此數的掃瞄,否則令p=

pp=p

xorxor ax

。ax。

3、查詢:

用線性基求這組數xo

rxor

出的最大值:從高往低掃ax

ax,若異或上ax

ax使答案變大,則異或。

4、判斷:

用線性基求乙個數能否被xo

rxor

出:從高到低,對該數每個是11

的位置x

x,將這個數異或上ax

ax(注意異或後這個數為1的位置和原數就不一樣了),若最終變為00

,則可被異或出。當然需要特判00

(在構造過程中看是否有p變為0即可)。例子:

(11111

,10001

)(11111,10001)

的線性基是a5

=11111

a5=11111,a

4=01110

a4=01110

,要判斷

11111

11111

能否被xor

xor出,

11111

11111 x

orxor a5

a5=0=0

,則這個數後來就沒有是11

的位置了,最終得到結果為00

,說明11111

11111能被x

orxor出。

個人談一談對線性基的理解:

很多情況下,只有有關異或運算和求最值,就可以用到線性基。線性基有很多很好的性質,比如說如果有很多個數,我們可以構出這些數的線性基,那麼這個線性基可以通過互相xo

rxor

,能夠構出原來的數可以相互xo

rxor

構出的所有的數。所以可以大大減少判斷的時間和次數。同時線性基的任何乙個非空子集都不會使得其xo

rxor

和為0,證明也很簡單,反證法就可以說明。這個性質在很多題目中可以保證演算法合法性,比如:bz

oj2460

bzoj2460。

構造的方法有點像貪心,從大到小保證高位更大。也比較好理解。就是這幾行**:?1

2

3

4

5

6

7

8

9

10

11

12

13

for(inti=1;i<=n;i++)//選入線性基中

a[i]^=p[j];

}

}

可以把nn

個數變成只有最大的數的二進位制位數那麼多個數,這就是線性基的優秀之處。

查詢的話,也是乙個貪心思想,如果可以使得an

sans

更大,就把這一位的基xo

rxor進a

nsans。

1for(int i=62;i>=0;i--) if((ans^p[i])>ans) ans=ans^p[i];//

從線性基中得到最大值

這就是線性基的基本用法和個人的一些理解。

模板 線性基

難度較大,請勿棄療 給定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的子集 線性基中每個元素的異或方案唯一,也就是說,線性基中不同的異或組合異或出的數都是不一樣的。線性基的二進位制最高位互不相同。這樣我們先構造出線性基 然後貪心的去搞最大...

線性基 模板

線性基的用處 洛谷p3812 牛客練習賽26d 參考部落格 這位童鞋寫得很好 求異或最大值 include bits stdc h using namespace std typedef long long ll const int maxn 1e5 5 const int mod 1e9 7 co...