題目大意:
給你n個數,求這些數能異或出的數的最大值。
思路:線性基模板。
b中的數滿足對於每個b[i],最高位在第i位。
構造方法就是對於每個數字,從高到低列舉每乙個1,如果這一位對應的b[i]還沒有,就把這個數作為b[i],如果有,就把這個數異或上b[i]。
考慮兩個數a,b,它們能異或出來的數為0,a,b,a xor b,如果把b換成a xor b,它們能異或出來的數還是0,a,b,a xor b。
所以b能異或出來的值域和a能異或出來的值域相同。
最後能異或出的最大值可以用類似貪心的思想。
從高到低列舉每個數,如果和現在的ans異或起來比ans大那麼就異或,不然就不管。
這樣就能優先保證更高的位出現在答案中,也就可以保證ans最大。
1 #include2 #include3 #include4 typedef longlong
int64;
5inline int64 getint()
12const
int n=51;13
int64 b[n];
14int
main() else26}
27}28 int64 ans=0;29
for(register int i=n-1;~i;i--)
32 printf("
%lld\n
",ans);
33return0;
34 }
洛谷 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...