模板 線性基

2022-04-29 21:00:12 字數 1155 閱讀 5794

處理關於子集的異或和的問題,比如子集異或和的最大值,或者能不能異或出某個數

從一堆數中處理出一組線性無關(?)的數,使得這些數能異或出的數和原來能異或出的數相同

線性基中,以每個位置為最高位1的數(最多)只有乙個,這樣就保證了線性無關

依次處理每個數,對於x,從大到小掃瞄它的每一位,當掃到第i位為1時:

若線性基中沒有最高位為i的數,則把x插到線性基中,結束掃瞄

若有,則把x異或上那個數,繼續做

這樣做,如果乙個數最終沒有被插入線性基中,證明它已經能被線性基中的數表示

而插到線性基中的數,也一定是幾個原數的異或和

最後我如果想找能異或出的最大的數,那就從高到低掃線性基中的每個數,如果異或上能使答案變大,就異或上,畢竟機不可失時不再來

luogu3812

1 #include2

#define clr(a,x) memset(a,x,sizeof(a))

3#define mp make_pair

4using

namespace

std;

5 typedef long

long

ll;6 typedef unsigned long

long

ull;

7 typedef pairpa;

8const

int maxn=55;9

10inline ll rd()

13while(c>='

0'&&c<='

9') x=x*10+c-'

0',c=getchar();

14return x*neg;15}

1617

intn;

18ll a[maxn],x[maxn];

1920

intmain()else a[i]^=x[j];31}

32}33}

34 ll ans=0;35

for(i=50;i>=0;i--)

38 printf("

%lld\n

",ans);

39return0;

40 }

如果您像我一樣容易忘記寫break的話,可以考慮不寫else,反正如果我這次插進去了,再異或上我自己就變成了0,就相當於break了

模板 線性基模板

數學太差,直接線性基當資料結構用orz 表示數集 1,2 k 1 表示乙個異或集合 可以說是將原數集壓縮 性質 直接抄的orz,雖然也不是特別懂 0 2.線性基的異或集合中每個元素的異或方案唯一,其實這個跟性質1是等價的。3.線性基二進位制最高位互不相同。1,2n 1 1,2n 1 1,2n 1 5...

模板 線性基

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