題目傳送門
用b來存線性基,將各個元素轉化為二進位制來看,b[i]裡存的是最高位的1在i位的數,如果b[i]裡已經存了數了,則將這個數與b[i]異或把異或後的值按照這種方法繼續往下存入,直到全部存完。
因為線性基是由原集合構造的,顯然原集合裡的數可以異或出線性基里的所有數,又因為ab=c,則ac=b,所以原集合中的所有數也可以由線性基構造出來。又因為a^a=0,所以顯然線性基可以構造出原陣列可以構造的所有異或和。
為了求最大值,我們從最高位1最大的開始往小的異或,如果異或後會變大,則異或,變小則捨棄,最後得出的即為最大值。因為我們異或的數的最高位1遞減,如果變大說明下乙個異或的數的最高位1對應的位置上,我們的答案從0變為了1,否則是從1變為了0,如果是從1變為0,後面的異或不能使這個0重新變為1,只會改變後面的位數,這個損失比後面所以可能增加的都大,所以不能選。
#include #define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll s[55], b[70];
int main()}}
}ll ans = 0;
for(int i = 50; i >= 0; i --)
cout << ans << endl;
}
洛谷 P3812 模板 線性基
這是一道模板題。給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。第一行乙個數n,表示元素個數 接下來一行n個數 僅一行,表示答案。輸入 1 2 1 1輸出 1 11 n 50,0 si 250 1 leq n leq 50,0 leq s i leq 2 1 n 50,0 ...
洛谷P3812 模板 線性基
給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。1 leq n leq50,0 leq a i leq 2 顯然重複不重複沒有什麼區別。直接套線性基板子。include using namespace std typedef long long type const int...
洛谷P3812 模板 線性基
這是一道模板題。給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。輸入格式 第一行乙個數n,表示元素個數 接下來一行n個數 輸出格式 僅一行,表示答案。輸入樣例 1 複製2 1 1 輸出樣例 1 複製1 1 leq n leq 50,0 leq s i leq 2 1 n 5...