模板—数学—线性基
Code(高斯消元版):
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 1000010
long long num[N],place[N],ans; int n; bool v[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&num[i]);
for(int j=63;~j;j--)
{
int p=0;
for(int i=1;(!p)&&i<=n;i++)
if((!v[i])&&((num[i]>>j)&1ll)) p=i;
if(!p) {place[j]=0;continue;}
v[p]=true,place[j]=num[p];
for(int i=1;i<=n;i++) if(i!=p&&((num[i]>>j)&1ll))
num[i]^=num[p];
}
for(int i=63;~i;i--) ans=max(ans,ans^place[i]);
printf("%lld\n",ans);
}
Code(普通版):
#include <cstdio>
#include <algorithm>
using namespace std;
long long place[100],x,ans; int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
for(int j=63;~j;j--) if((x>>(j*1ll))&1ll)
{
if(!place[j]) {place[j]=x;break;}
else x^=place[j];
}
}
for(int i=63;~i;i--) if(ans<(ans^place[i])) ans^=place[i];
printf("%lld\n",ans);
}