模板—数学—线性基
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 ",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 ",ans); }