1. 程式人生 > >洛谷P3812 【模板】線性基

洛谷P3812 【模板】線性基

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}1n50,0Si?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 【模板】線性基