五个数:a[5]={6,7,2,3,4},a[i]=,从高位到低位检查a[i]的每一位是否位1,p[]存线性基

原始的线性基:


对于a[i],如果a[i]的j位为1

  • p[j]=0,p[j]=a[i]
  • p[j]!=0,表明已经填入数了,a[i]^=p[j],继续遍历新的a[i]的下面的位,判断是否是1

所以这五个数对应的行阶梯矩阵为:

如果p[j]=0,那么这个a[i]就先入为主的填到p[j]的位置,且不会再更新这个p[j]

如果p[j]已经有数了,那么消去a[i] j位的1(a[i]^=p[j]),再往后找可以填入的p[j],每次无法填入的时候都要消去a[i] j位的1,最终如果a[i]=0, 说明a[i]和a[i]前面出现的数异或会得到0。BZOJ2460就是用这种思路求解的。

这些不为0的p[i]又可以组合成 给出的n个数能得到的所有异或值

To sum up:

p[j]表示的是在顺序遍历a[]时,最先出现的 j位为1的异或值(可能是由1个数得到的,也可能是多个数异或得到的,但未必就是j位为1的最大的异或值)

a[i]无法填入(最终a[i]=0),说明a[i]和它前面出现的数异或会得到0。

这些不为0的p[i]又可以组合成 给出的n个数能得到的所有的异或值BZOJ2115就利用了这个性质

模版:

void getXian()
{for(int i=0;i<n;i++){for(int j=max_base;j>=0;j--){if(a[i]>>j&1){if(p[j])a[i]^=p[j];else{p[j]=a[i];break;}}}}
}

力求满足对角矩阵的线性基:


最开始学线性基的时候,大佬们讲的都是这种线性基:https://blog.sengxian.com/algorithms/linear-basis

它和原始的线性基的不同之处在于:在把a[i]填入p[j]时,要用p[j]下面的行消去p[j]的j位之后的1,用p[j]消去p[j]上面行中j位为1的p[k] (因为不为0的p[j]的j位一定是1)。这样处理完之后的行阶梯矩阵就和对角矩阵很接近了,具体讲解在这里

所以这五个数对应的行阶梯矩阵为:

To sum up:p[j]表示由n个数得到的j位为1的最小的异或值,利用这个性质就可以求n个数异或得到的第k小的数了

注意:如果得到的线性基的p[j]不为0的数目num和给出的数字数目n相同的话,那么这n个数无法通过异或得到0

模版:

void getXian()
{for(int i=0;i<n;i++){for(int j=max_base;j>=0;j--){if(a[i]>>j&1){if(p[j])a[i]^=p[j];else{p[j]=a[i];for(int k=j-1;k>=0;k--)if(p[j]>>k&1)p[j]^=p[k];for(int k=j+1;k<max_base;k++)if(p[k]>>j&1)p[k]^=p[j];break;}}}}
}

【算法笔记】对两种线性基的理解相关推荐

  1. [学习笔记]省选(算法?数据结构?)·线性基

    一.开头 神犇MX:怎么样?xyz32768,你学不会后缀自动机,真是菜啊! xyz32768:是啊,我本来就很菜啊! 神犇MX:你不服的话,再考你一道题:给定一个nnn个数的数集,求一个子集,使这个 ...

  2. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...

  3. 水平集方法引入主动轮廓模型算法中的两种方法

    水平集方法引入主动轮廓模型算法中的两种方法 1.传统的基于主动轮廓模型和水平集理论的方法 2.变分水平集方法 在讲解水平集理论在主动轮廓模型中的应用前,我们先用流程图说明一下常见的处理主动轮廓模型的流 ...

  4. (笔记)两种判断奇数偶数的方法

    (笔记)两种判断奇数偶数的方法 学习的需要,查找了如何判断奇偶数的方法,自己做了以下笔记. 方法来自网络,已标明出处. 方法一 .求余% 具体实现: 1.if( x % 2 )     // 奇数   ...

  5. sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...

    本周小结!(回溯算法系列三)续集 在 本周小结!(回溯算法系列三) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交 ...

  6. 【CV/Matlab系列】基于Matlab的白平衡算法实现(两种方法)

    DATE: 2020.11.22 文章目录 1.前言 2.白平衡算法 2.1 原始图像 2.2 灰色世界法 2.3 完美反射算法 1.前言 在之前大学毕设时,设计了一种基于Matlab的白平衡算法,采 ...

  7. PCA(2):PCA算法实现的两种方式

    因为样本个数和特征维度的是不相等de,所以组成的矩阵不是方阵. 第一种方式:特征分解思路(特征值分解要求分解的矩阵是方阵) 基于样本特征维度,先求协方差矩阵---->再特征分解(因为协方差矩阵是 ...

  8. 经典算法之基数排序两种实现

    /************************ author's email:wardseptember@gmail.com date:2017.12.7 基数排序两种实现方法 ********* ...

  9. 线代学习笔记(一)——线性代数的通俗理解

    线性代数通俗理解 本篇笔记内容主要来源于45分钟线性代数通俗讲解_哔哩哔哩_bilibili,非常感谢up主的分享,这里我加入了部分自己的理解,与自己所学的知识结合完成. 基础概念 数据的维度:即数据 ...

  10. [BZOJ 3811]玛里苟斯(线性基)尽量理解的题解

    文章目录 title solution code title 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随 ...

最新文章

  1. Wind River Helix系统及物联网解决方案 简化企业IOT部署
  2. 【复杂网络】用户画像不应脱离社会关系,谈复杂网络的关键技术和应用实践
  3. docsify and awesome
  4. Spark中的Shuffle算子
  5. 7月新的开始 - Axure学习05 - 元件库的创建
  6. 淘宝 封住baidu的蜘蛛了吗?
  7. 排序问题-fastjson-JSONObject
  8. 2022 年移动应用开发终极指南
  9. 微信公众号测试号申请及访问(图详解)
  10. 计算机团队霸气名称大全,霸气吃鸡游戏团队名字大全
  11. 《mysql必知必会》学习笔记
  12. 【OpenCV】PNG图片压缩方法
  13. freeswitch拨打分机号
  14. win10读取不了U盘或者移动硬盘的解决方法
  15. 大家是怎么学好python啊??
  16. 什么是卫片?什么是卫片执法?一文了解卫片执法基础知识
  17. scanf在c语言中的作用,c语言中scanf的基本用法
  18. 离散数学-集合:1.集合的基本概念
  19. MPU6050原始数据计算加速度、角速度、倾斜角度
  20. 通达信自动交易系统接口定义

热门文章

  1. 如何在Global.asax文件中实现定时采集新闻
  2. Qt学习之路(21): event()
  3. 【JavaEE】javaee一些问题方案
  4. java抽象类可以new_java的抽象类,接口,普通类是否可以直接NEW,并且复写方法?
  5. 计算机等级考试oracle,用spt更新ORACLE
  6. xml简单理解,xml增删改操作,仅作笔记,不作为学习借鉴
  7. c语言 称重系统设计,基于L—PSIII的电子称重系统的设计
  8. java 程序路径_Java程序路径
  9. 属性篇(3)—If you love css …
  10. 初学者指南:为开源做贡献