Luogu3812 模板 線性基

2022-05-17 14:55:18 字數 761 閱讀 4633

參考\(blog\):

首先,對於序列\(a,b,c\),它與\(a,b,b\quad xor \quad c\)能異或出的數的種類相同。

所以我們插入乙個數時,可以與原序列中的數瞎異或。

我們可以使序列中的數的二進位制最高位不同(這種情況是唯一的)。

然後貪心取就好了。

上述做法在**\(solve1\)函式中。

\(update:\)更新了高斯消元求線性基,可以判別那些列有主元(不是很懂主元相關),在**\(solve2\)函式中。

\(code:\)

#include#include#include#define n 55

#define ll long long

using namespace std;

int n,t;

ll ans,a[n],g[n];

void solve1()}}

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

ans=max(ans,ans^g[i]);

printf("%lld\n",ans);

}void solve2()

for (int j=50;j>=0;--j)

if ((a[i] >> j) & 1)

}for (int i=1;i<=t;++i)

ans=max(ans,ans^a[i]);

printf("%lld\n",ans);

}int main()

線性基(模板) LUOGU 3812

題面 線性基,是構造出一組數 ax,ax 1 a1,ax的二進位制最高位為x。這些數字能異或和可以表示原來所有數的異或和。其實相當於乙個高斯消元的過程。所以我們按位列舉,如果這一位曾經沒數,就直接加入,如果有數,我們就讓這兩個數異或起來,進而繼續表示其他的數。要求最大值則按位貪心即可。include...

P3812 模板 線性基

線性基可以解決的問題 給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。然後這道題也是一道模板題了。什麼是線性基呢?就是乙個去求解異或和最值的問題,為什麼可以求異或和最大呢,這裡需要用到了異或的性質了。a b c則有a c b以及a b c。所以我們距離9 10 12 11這...

P3812 模板 線性基

線性基是什麼?你可以理解為將乙個序列處理完之後得到的產物,並且有如下性質 1.原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到。2.線性基裡面的任意一些數異或起來都不能得到0 3.線性基裡面的數的個數唯一,並且在保持性質一的前提下,數的個數是最少的 因此,線性基可以計算一段序列中異或和最大,...