zoukankan      html  css  js  c++  java
  • 线性基求交

    设有两个线性基 (alpha,eta),如果 (eta_i) 能被 ( heta igcup phi, heta subseteq alpha,phi subseteq {eta_0,eta_1,...,eta_{i-1}}) 表示,则把 ( heta) 加入答案线性基即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    struct linearbase
    {
        int a[64];
        linearbase()
        {
            memset(a,0,sizeof a);
        }
        void insert(int k)
        {
            for(int j=60; j>=0; --j)
                if((k>>j)&1ll)
                    if(a[j]==0)
                    {
                        a[j]=k;
                        break;
                    }
                    else k^=a[j];
        }
        int& operator [] (int i)
        {
            if(i<64) return a[i];
        }
        bool check(int x)
        {
            for(int i=60; i>=0; --i)
            {
                if((a[i]^x)<x) x^=a[i];
            }
            return x==0;
        }
        void print()
        {
            cout<<"Linear Base Output"<<endl;
            for(int i=60;i>=0;--i) if(a[i]) cout<<i<<": "<<a[i]<<endl;
            cout<<"-----"<<endl;
        }
        friend linearbase operator *(linearbase a,linearbase b)
        {
            linearbase all,c,d;
            for(int i=60;i>=0;--i)
            {
                all[i]=a[i];
                d[i]=1ll<<i;
            }
            for(int i=60;i>=0;--i)
            {
                if(b[i])
                {
                    int v=b[i],k=0,fg=1;
                    for(int j=60;j>=0&&fg;j--)
                    {
                        if(v>>j&1)
                        {
                            if(all[j]) v^=all[j],k^=d[j];
                            else all[j]=v,d[j]=k,fg=0;
                        }
                    }
                    if(fg)
                    {
                        int v=0;
                        for(int j=60;j>=0;j--)
                        {
                            if(k>>j&1) v^=a[j];
                        }
                        c.insert(v);
                    }
                }
            }
            return c;
        }
        int solve() {
            int ans = 0;
            for(int i=60; i>=0; --i)
                if((ans^a[i]) > ans) ans^=a[i];
            return ans;
        }
    };
    
    signed main()
    {
        linearbase a,b;
        a.insert(1);
        a.insert(2);
        b.insert(3);
        linearbase c=a*b;
        a.print();
        b.print();
        c.print();
    }
    
    
  • 相关阅读:
    libevent源码分析--(转)
    libevent源码分析(转)
    服务器模型---总结
    暴力英语学习法 + 严格的目标管理 = 成功快速靠谱的学好英语(转)
    log4net写入mysql完整例子
    form操作
    ASP.NET Razor
    java爬虫:在请求body中增加json数据采集
    asp.net mvc3登录验证
    远程复制无法读取源文件或磁盘
  • 原文地址:https://www.cnblogs.com/mollnn/p/13253408.html
Copyright © 2011-2022 走看看