给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值。
BZOJ_4269_再见Xor_线性基
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <bitset>
using namespace std;
int n,a[100050],b[100],cnt,tot;
void Gauss() {
int i,j;
for(i=(1<<30);i;i>>=1) {
tot++;
int mx=tot;
while(mx<=n&&!(a[mx]&i)) mx++;
if(mx==n+1) {
tot--; continue;
}
b[++cnt]=i;
swap(a[tot],a[mx]);
for(j=1;j<=n;j++) {
if(tot!=j&&(a[j]&i)) a[j]^=a[tot];
}
}
}
int main() {
scanf("%d",&n);
int i;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
Gauss();
int ans=0;
for(i=1;i<=tot;i++) ans^=a[i];
printf("%d %d\n",ans,ans^a[tot]);
}
原文:https://www.cnblogs.com/suika/p/8967304.html