洛谷P3812 【模板】線性基
阿新 • • 發佈:2018-06-16
int clas ott style psu ont radi reg query
題目背景
這是一道模板題。
題目描述
給定n個整數(數字可能重復),求在這些數中選取任意個,使得他們的異或和最大。
輸入輸出格式
輸入格式:
第一行一個數n,表示元素個數
接下來一行n個數
輸出格式:
僅一行,表示答案。
輸入輸出樣例
輸入樣例#1: 復制2 1 1輸出樣例#1: 復制
1
說明
1 \leq n \leq 50, 0 \leq S_i \leq 2 ^ {50}1≤n≤50,0≤Si?≤250
首先對這$n$個數建出線性基
然後貪心的選最大就好
線性基。。感覺又開了個天坑
#include<cstdio> #include<cstring> #include<algorithm> #define int long long using namespace std; const int MAXN = 2 * 1e6 + 10, INF = 1e9 + 10, B = 63; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < ‘0‘ || c > ‘9‘) {if(c == ‘-‘) f = -1; c = getchar();}while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = getchar(); return x * f; } int N; int P[MAXN]; void Insert(int x) { for(int i = B; i >= 0; i--) { if(x & (1ll << i)) { if(!P[i]) {P[i] = x; break;} x ^= P[i]; } } }int Query() { int ans = 0; for(int i = B; i >= 0; i--) if(ans < (ans ^ P[i])) ans = ans ^ P[i]; return ans; } main() { #ifdef WIN32 freopen("a.in", "r", stdin); #endif N = read(); for(int i = 1; i <= N; i++) { int val = read(); Insert(val); } printf("%lld", Query()); }
洛谷P3812 【模板】線性基