參考\(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.線性基裡面的數的個數唯一,並且在保持性質一的前提下,數的個數是最少的 因此,線性基可以計算一段序列中異或和最大,...