P3812 【模板】线性基

题目背景

这是一道模板题。

题目描述

给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。

输入输出格式

输入格式:

第一行一个数n,表示元素个数
接下来一行n个数
输出格式:
仅一行,表示答案。

输入输出样例

输入样例#1:

2
1 1
输出样例#1:

1

说明

$1≤n≤50,0≤Si​≤250$

代码

**线性基构造** $circ$逆序枚举$t$所有为$1$的二进制位$j= L o1$ $qquad circ$如果$a_j e 0,t=t\,xor\,a_j$ $qquad circ$如果$a_j = 0$则 $qquadqquad circ$枚举$kin left[ 0 o j ight),t$的第$k$位为$1$$,t =t\,xor\,a_k$ $qquadqquad circ$枚举$kin left(j o L ight],t$的第$k$位为$1$$,a_k =a_k\,xor\,t$ 最大值为$xor sum\,a_i$ ```cpp #include using namespace std; const int maxl=60; long long ans=0; struct LinearBasics { long long a[maxl+1]; LinearBasics() { memset(a,0,sizeof(a)); } void insert(long long t) { for(int j=maxl;j>=0;j--) { if(!(t&(1ll<'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*f; } int main() { int n=read(); for(int i=1;i<=n;i++) lb.insert(read()); printf("%lld",lb.querymax()); return 0; }
原文地址:https://www.cnblogs.com/DriverBen/p/10737432.html