BZOJ 4269: 再见Xor|高斯消元

来源:互联网 发布:淘宝手机p图教程视频 编辑:程序博客网 时间:2024/06/14 03:49

高斯消元搞一搞,搞出线性基
然后就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 100010using 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;}
1 1