題目大意:給定$n$個數,選取任意個數,使得他們的異或和最大。
題解:線性基,原理貪心看不懂。
對於每乙個數,設它的最高位的$1$在第$i$位,如果此時$p_i$為空,就將這個數加入線性基,否則異或上$p_i$繼續找。最後貪心看$ans$異或上線性基的這一位會不會變大,若變大就轉移
卡點:無
c++ code:
#include int n;long long x, p[55], ans;
int main()
}} }
for (int i = 50; ~i; i--) if (ans < (ans ^ p[i])) ans = ans ^ p[i];
printf("%lld\n", ans);
return 0;
}
洛谷 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...