BZOJ 4269 再见Xor 高斯消元

来源:互联网 发布:mac os iso镜像 编辑:程序博客网 时间:2024/06/03 13:55

题目大意:给定n个数,求能异或出来的最大值和次大值

是谁往BZ上传傻逼题……
高斯消元求线性基,都异或起来是最大值,再异或一下最小的线性基就是次大值

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 100100using namespace std;int n,a[M];void Gauss_Elimination(){    int i,j,k=0;    for(j=1<<30;j;j>>=1)    {        for(i=k+1;i<=n;i++)            if(a[i]&j)                break;        if(i==n+1) continue;        swap(a[++k],a[i]);        for(i=1;i<=n;i++)            if(i!=k&&a[i]&j)                a[i]^=a[k];    }    n=k;}int main(){    int i;    cin>>n;    for(i=1;i<=n;i++)        scanf("%d",&a[i]);    Gauss_Elimination();    int ans=0;    for(i=1;i<=n;i++)        ans^=a[i];    cout<<ans<<' '<<(ans^a[n])<<endl;    return 0;}
0 0