再談線性基

2022-03-04 08:01:09 字數 3068 閱讀 5186

1、線性基:

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

a2,.

..an

'>a1,a2,...an

,其中a

x'>

ax的最高位的1

'>1

在第x'>

x位。通過線性基中元素xor

'>xor

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

'>xor

出數的值域相同。

2、線性基的構造法:

對每乙個數p

'>p

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

'>x

位為1'>1

時,若a

x'>

ax不存在,則ax=

p'>ax=p

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

'>p = 

p  xor

'>xor ax。

'>ax。(此處若此位存在,則必然存在有更高位的二進位制數的1在此位置,異或則會使本身變優

p'>x

'>1

'>a

x'>ax=

p'>p=p

'>xor

'>ax。

'>)

3、查詢:

用線性基求這組數xor

'>xor

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

x'>

ax,若異或上a

x'>ax

使答案變大,則異或。

4、判斷:

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

'>xor

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

'>1

的位置x

'>x

,將這個數異或上a

x'>

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

'>

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

'>0

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

11111

,10001

)'>

(11111,10001)的線性基是a5=

11111

'>

a5=11111,a4=

01110

'>a4=01110

,要判斷11111

'>11111

能否被xor

'>xor

出,11111

'>11111xo

r'>

xor a

5'>

a5=0

'>=0

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

'>1

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

'>0

,說明11111

'>11111

能被xo

r'>xor

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

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

'>xor

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

'>xor

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

'>xor

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

j2460

'>bzoj2460。x

or'>xor

'>xor

'>bzo

j2460

'>

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

1

for(int i=1;i<=n;i++) //

選入線性基中

89        a[i]^=p[j];

1011}12

13    }

可以把n

'>n

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

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

'>ans

更大,就把這一位的基xor

'>xor進an

s'>ans

。1 for(int i=62;i>=0;i--) if((ans^p[i])>ans) ans=ans^p[i];//從線性基中得到最大值 

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

更新下線性基的模板

1 #include2 #include3

using

namespace

std;

4 typedef long

long

intll;

5const

int maxn = 1e5 + 7;6

const

int mod = 1e9 + 7;7

struct

linear_basis

16void ins(ll x)

23 x ^=b[i];24}

25}26 flag = true;27

return;28

}29bool fin(ll x) 39}

40return0;

41}42 ll max(ll x)

47return

res;48}

49 ll min(ll x)

55return

res;56}

57 ll rebuild() 67}

68for(int i = 0; i <= 62; i++) 72}

73ll kth_max(ll k)

85return

res;86}

87} lb;

88void merge(linear_basis &a, linear_basis &b)

94 b =a;95}

96int

main()

線性基題目:

模板 線性基

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

線性基講解

1 線性基 若干數的線性基是一組數a1 a2,a na1,a2,an 其中axax 的最高位的11 在第xx位。通過線性基中元素xo rxor 出的數的值域與原來的數xo rxor 出數的值域相同。2 線性基的構造法 對每乙個數pp 從高位到低位掃,掃到第xx 位為11時,若ax ax不存在,則ax...