SGU 275 异或线性基

来源:互联网 发布:北京蓝鲸网络官网 编辑:程序博客网 时间:2024/06/09 21:55

题目链接


题意:给你n个数,求这些数能够异或出的最大值是多少?


思路:
异或线性基的入门题。

推荐:优秀的学习资料

求这n个数的异或线性基,由性质,线性基里所有的数的异或和就是所需要求的最大值。

至于构建线性基的方法,类似于高斯消元的思想,还是很好理解的~


代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int A = 100 + 10;ll a[A],b[A];void solve(int n){    for(int i=1 ;i<=n ;i++) for(int j=62 ;j>=0 ;j--){        if((a[i]>>j)&1){            if(b[j]) a[i]^=b[j];            else{                b[j] = a[i];                for(int k=j-1 ;k>=0 ;k--) if(b[k]&&((b[j]>>k)&1)) b[j] ^= b[k];                for(int k=j+1 ;k<=62;k++) if((b[k]>>j)&1)         b[k] ^= b[j];                break;            }        }    }    ll ans = 0;    for(int i=0 ;i<=62 ;i++) ans ^= b[i];    printf("%I64d\n",ans);}int main(){    int n;scanf("%d",&n);    for(int i=1 ;i<=n ;i++) scanf("%I64d",&a[i]);    solve(n);    return 0;}
原创粉丝点击