高斯消元搞一搞,搞出线性基
然后就wa了,搞得我莫名其妙去查题解,然后发现和PoPoQQQ大爷写的一模一样,smg?感谢bz提供数据,终于发现错误
用高斯消元搞出线性基,最大的值就是全都抑或起来,此小的就是出最小的那个基其他全都抑或起来
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#define T 100010
using namespace std;
int sc()
{
int i=0; char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i;
}
int a[T],n,now,ans=0;
void Gauss()
{
for(int k=30;k>=0;k--)
{
int i;
for(i=now+1;i<=n;i++)
if(a[i]&(1<<k)) break;
if(i>n)continue;
swap(a[i],a[++now]);
for(int i=1;i<=n;i++)
if(i!=now&&((1<<k)&a[i]))
a[i]^=a[now];
// ans^=a[now]; sb错误在此!!!! a[now]以后还会更新 !!!!!
}
}
int main()
{
n=sc();
for(int i=1;i<=n;i++)a[i]=sc();
Gauss();
for(int i=1;i<=now;i++)
ans^=a[i]; //要到最后才能更新答案
cout<<ans<<" "<<(ans^a[now])<<endl;
return 0;
}