线性基(模板)

这里是连接o(´^`)o

线性基性质:

1.原序列里面的任意一个数都可以由线性基里面的一些数异或得到。
2.线性基里面的任意一些数异或起来都不能得到0 0
3.线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>

#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define sl(x) scanf("%lld",&(x))
#define rep(i,a,b) for(int i=a;i<=b;i++)

using namespace std;

int p[105];

void Insert(int now)
{
    per(i,62,0)
    {
        if((now&((ll)1<<i)))
        {
            if(!p[i])
            {
                p[i]=now;
                break;
            }
            now^=p[i];
        }
    }
}

#undef int
int main()
{
#define int long long
    int n;
    sl(n);
    rep(i,1,n)
    {
        int now;
        sl(now);
        Insert(now);
    }
    int ans=0;
    per(i,62,0)
        if((ans^p[i])>ans) ans^=p[i];
    cout<<ans<<"\n";

    return 0;
}

原文地址:https://www.cnblogs.com/minun/p/11329469.html

时间: 2024-10-04 17:05:23

线性基(模板)的相关文章

HDU3949 线性基模板

Ac链接 给定n个数,求子集异或和的第k大.\(n\le10^5,a_i\le10^9\). 第一步肯定是构造线性基.设线性基的基底数量为k,那么子集异或和本质不同的个数为\(2^k\)(如果有为0的情况).其实求第k大很简单,你把k拆分成2进制,对应基底从左到右的每一位,如果为1就异或上去就行了.不过我们需要分为两种情况,一个是存在异或和为0的情况,一个是不存在的.如果不存在异或和为0,需要把k+1. #include<bits/stdc++.h> #define ll long long

线性基模板

题目描述 给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大. 输入输出格式 输入格式: 第一行一个数n,表示元素个数 接下来一行n个数 输出格式: 仅一行,表示答案. 输入输出样例 输入样例#1: 复制 2 1 1 输出样例#1: 复制 1 说明 1≤n≤50,0≤Si?≤2^50 #include<iostream> #include<algorithm> using namespace std; #define ll long long ll a[10

[洛谷3812]【模板】线性基

题目大意: 给你n个数,求这些数能异或出的数的最大值. 思路: 线性基模板. b中的数满足对于每个b[i],最高位在第i位. 构造方法就是对于每个数字,从高到低枚举每一个1,如果这一位对应的b[i]还没有,就把这个数作为b[i],如果有,就把这个数异或上b[i]. 考虑两个数a,b,它们能异或出来的数为0,a,b,a xor b,如果把b换成a xor b,它们能异或出来的数还是0,a,b,a xor b. 所以b能异或出来的值域和a能异或出来的值域相同. 最后能异或出的最大值可以用类似贪心的思

[P3812][模板]线性基

解题关键:求异或最大值.线性基模板题. 极大线性无关组的概念. 异或的值域相同. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int MAX_BASE=63; ll b

bzoj 2460 [BeiJing2011]元素 (线性基)

链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2460 题意: 给你一堆矿石,矿石有a,b两种性质,取任意个矿石,满足取得的这些矿石a性质异或和不为0,且b性质和最大,求b性质和的最大值. 思路: 线性基模板题, 根据线性基的性质: 线性基的任意一个子集异或和不为0.我们可以根据这些矿石的b性质从大到小排序,依此将这些矿石的a性质插到线性基里,如果能够插入的话就选这个,不能插入的话就不选. 实现代码: #include<bits/stdc

[hdu3949]XOR(线性基求xor第k小)

题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int MAX_BASE=63; ll base[64],a[10006]

【模板】线性基

线性基就是一种可以维护异或和的东西,我还没太懂它到底有什么用,但是很好写,而且思路也很清晰,所以板子还是很简单的. 题干: 题目背景 这是一道模板题. 题目描述 给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大. 输入输出格式 输入格式: 第一行一个数n,表示元素个数 接下来一行n个数 输出格式: 仅一行,表示答案. 输入输出样例 输入样例#1: 复制 2 1 1 输出样例#1: 复制 1 说明 1≤n≤50,0≤Si≤250 1 \leq n \leq 50, 0 \

P3812 【模板】线性基

P3812 [模板]线性基 理解 :线性基 类似于 向量的极大无关组,就是保持原来所有数的异或值的最小集合, 求解过程也类似,可以 O( 60 * n )的复杂度求出线性基,线性基有许多性质,例如 线性基 里面的数进行异或 的值域与原来所有数异或的值域相同. #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 123 ll n,a[maxn],ans,p[maxn]; void getji

[算法模板]线性基

线性基 GavinZheng敲懒的... menci大佬的线性基博客 模板代码引自menci: struct LinearBasis { long long a[MAXL + 1]; LinearBasis() { std::fill(a, a + MAXL + 1, 0); } LinearBasis(long long *x, int n) { build(x, n); } void insert(long long t) { for (int j = MAXL; j >= 0; j--)