码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】线性基求交

时间:2019-10-05 22:11:09      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:cpp   break   i++   memset   merge   ret   ++   tmp   ems   

线性基求交

struct lb{
    ll p[63];
    lb(){
        memset(p,0,sizeof(p));
    }
    void clear(){
        memset(p,0,sizeof(p));
    }
    void ins(ll x){
        for(int i=60;i>=0;i--) if((x>>i)&1){
            if(!p[i]){
                p[i]=x;
                return;
            }else x^=p[i];
        }
    }
};
lb merge(lb a,lb b){
    lb g=lb(),tmp=a;
    ll cur,d;
    for(int i=0;i<=60;i++) if(b.p[i]){
        cur=0,d=b.p[i];
        for(int j=i;j>=0;j--) if(d>>j&1){
            if(tmp.p[j]){
                d^=tmp.p[j],cur^=a.p[j];
                if(d) continue;
                g.p[i]=cur;
            }else tmp.p[j]=d,a.p[j]=cur;
            break;
        }
    }
    return g;
}

【模板】线性基求交

标签:cpp   break   i++   memset   merge   ret   ++   tmp   ems   

原文地址:https://www.cnblogs.com/xyq0220/p/11625761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!