zoukankan      html  css  js  c++  java
  • 线性基学习笔记

    用法&&概述

    线性基是一种数据结构,可以用来维护序列的异或相关(比如去重,求极值)
    似乎还可以求异或后的第k小值,但我不会

    对于值域,转成二进制之后的每一位 i 对应一个数 a[i],然后维护这个数。
    a[i] 它的二进制最高位就是第i位

    具体维护方式是:
    对于每次插入一个新的值 x
    进行如下操作:
    1· 若此时x的二进制最高位 k ,a[k] 的值为零,将a[k]=x,退出
    2· 否则 x^=a[k] , 此时x的第k位就为0了,然后继续 1操作,或者x==0退出

    代码

    插入

    int add(ll x)
    {
        for(re int i=62; i>=0;i--)
        if(x&(1LL<<i))
        {
            if(!a[i]) {a[i]=x;return 1;}
            else x^=a[x];
        }
        return 0;
    }
    

    求MAX

    int getmax()
    {
        ll ans=0;
        for(re int i=52;i>=0;i--)
            ans=max(ans,ans^a[i]);
    }
    

    查询最小值: 就是线性基中的最小值
    可通过线性基可异或出的值个数: (2^{线性基元素个数}-1)

  • 相关阅读:
    日报10.29
    日报10.28
    日报10.27
    周进度总结-6
    日报10.25
    日报10.23
    日报10.22
    日报10.21
    日报10.18
    STL bitset
  • 原文地址:https://www.cnblogs.com/yzhx/p/13161972.html
Copyright © 2011-2022 走看看