線性基基礎問題

2021-10-01 13:33:03 字數 1717 閱讀 2508

大佬的部落格

假設有n個數,這n個數能組成的異或和的集合為v,線性基就是能表示這個異或和集合v的最小集合。

線性基的作用:求解異或和第k小、異或和最大值、某個數是否存在於異或和集合裡等問題。

洛谷p3812

求異或和的最大值

#include

using

namespace std;

const

int maxn =

1e5+7;

typedef

long

long ll;

ll a[maxn]

, b[65]

, ans;

int n, m;

void

prepare()

}}}for

(int i =

0; i <=

62; i++

) ans ^

= b[i];}

intmain()

求異或第k小

題目鏈結

題意

給n個數,每次詢問所有數的異或和第k小。

思路

這是關於線性基的乙個問題,將所有數建立成乙個線性基數組,講所有線性基中不為0的數從低到高位與k的二進位制的低位到高位對應,將所有k的二進位制位上不為0的與之對應的線性基異或和就是第k小。

#include

using

namespace std;

const

int maxn =

1e5+7;

typedef

long

long ll;

ll a[maxn]

, b[65]

;int zero, n, m;

vector v;

void

prepare()

}}} zero = cnt != n;

v.clear()

;for

(int i =

0; i <=

62; i++)if

(b[i]

) v.

push_back

(b[i]);

}ll query

(ll x)

intmain()

}return0;

}

求異或和是第幾小

bzoj2844

#include

using

namespace std;

const

int maxn =

1e5+7;

typedef

long

long ll;

const

int mod =

10086

;ll a[maxn]

, b[65]

;int n, cnt;

vector<

int> v;

void

prepare()

}}}}

ll qpow

(ll a, ll b)

return ans;

}int

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...