zoukankan      html  css  js  c++  java
  • 自闭线性基模板

    粘一下自己觉得好的模板

    这个没学.jpg

    题目链接

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    typedef long long LL;
    const int maxn=1e4+7;
    struct L_B{
        LL d[61],p[61];
        int cnt;
        L_B(){
            memset(d,0,sizeof(d));
            memset(p,0,sizeof(p));
            cnt=0;
        }
        bool insert(LL val){
            for(int i=60;i>=0;i--){
                if(val&(1LL<<i)){
                    if(!d[i]){
                        d[i]=val;
                        break;
                    }
                    else val^=d[i];
                }
            }
            return val>0;
        }
        LL query_max(){
            LL ret=0;
            for(int i=60;i>=0;i--){
                if(ret^d[i]>ret)
                    ret^=d[i];
            }
            return ret;
        }
        LL query_min(){
            for(int i=0;i<=60;i++)
                if(d[i])
                return d[i];
            return 0;
        }
        void rebuild(){
            for(int i=60;i>=0;i--)
            for(int j=i-1;j>=0;j--){
                if(d[i]&(1LL<<j))
                    d[i]^=d[j];
            }
            for(int i=0;i<=60;i++)
                if(d[i])
                p[cnt++]=d[i];
        }
        LL kthquery(LL k){///第k小个异或值
            int ret=0;
            if(k>=(1LL<<cnt))
                return -1;
            for(int i=60;i>=0;i--)
                if(k&(1LL<<i))
                ret^=p[i];
            return ret;
        }
    };
    LL t,n,m,ce,a,b[maxn];
    bool flag;
    int main(){
        scanf("%lld",&t);
        ce=1;
        while(t--){
            L_B in;
            flag=true;
            scanf("%lld",&n);
            for(int i=1;i<=n;i++){
                scanf("%lld",&a);
                if(!in.insert(a))flag=false;
            }
            in.rebuild();
            scanf("%d",&m);
            for(int i=1;i<=m;i++)
                scanf("%lld",&b[i]);
            printf("Case #%lld:
    ",ce++);
            for(int i=1;i<=m;i++){
                if(flag)printf("%lld
    ",in.kthquery(b[i]));
                else printf("%lld
    ",in.kthquery(b[i]-1));
            }
        }
        return 0;
    }
  • 相关阅读:
    Oracle 获取创建控制文件的脚本
    ESXi下误删磁盘分区
    Oracle 3DES加密示例
    Oracle job 执行多个存储过程
    解开紧箍咒
    国际关系之美国南海战略意图(转)
    GHOST系统锁定主页常用软件及解决方案
    cut命令详解
    grep命令详解
    awk命令详解
  • 原文地址:https://www.cnblogs.com/helman/p/11329216.html
Copyright © 2011-2022 走看看