线性基

苟活一会,最近学习些东西,这里是线性基的板子题。
验板子请到

洛谷P3812
线性基主要功能是解决异或和找第kth大问题产生的,复杂度是log(N)
其通过对每个加入到集合中的数据进行一定的加工,使得每次查询为log(n)
支持插入数据,查找第k大,合并两个线性基的集合
进阶题
牛客网
通过逆向建立线性基可以A掉此题。

线性基模版(记得开long long)

#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include<climits>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <stdlib.h>
#include <time.h>
#include <iomanip>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
struct L_B{
    long long d[61],p[61];
    int cnt;
    L_B() //这个函数类似于构造函数,在创建的时候直接先调用一次
    {
        memset(d,0,sizeof(d));
        memset(p,0,sizeof(p));
        cnt=0;
    }
    bool insert(long long val)
    {
        for (int i=60;i>=0;i--)
            if (val&(1LL<<i))
            {
                if (!d[i])
                {
                    d[i]=val;
                    break;
                }
                val^=d[i];
            }
        return val>0;
    }
    long long query_max()
    {
        long long ret=0;
        for (int i=60;i>=0;i--)
            if ((ret^d[i])>ret)
                ret^=d[i];
        return ret;
    }
    long long 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];
    }
    long long kthquery(long long 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;
    }
};
L_B merge(const L_B &n1,const L_B &n2)
{
    L_B ret=n1;
    for (int i=60;i>=0;i--)
        if (n2.d[i])
            ret.insert(n2.d[i]);
    return ret;
}
int main()
{
   // freopen("in.txt","r",stdin);
   //freopen("in.txt","w",stdout);
    ll i,j,k,f1,f2,f3,f4,t1,t2,t3,t4;
    L_B a;
    int n,m;
    cin  >> n;
    for(i=1;i<=n;i++){
        cin >> t1;
        a.insert(t1);
    }
    cout << a.query_max() << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36124802/article/details/80050400