线性基定义性质及例题

线性基的定义 

以上是官方给出的线性基的定义,但是需要一定的线性代数的基础,其实线性基很好理解,我们用下面一个例子去讲解

假设有3个数,1,2,3,我们这三个数互相异或总共有八种可能,我们能否找到一组数去表示非0的剩余的异或的结果,当然可以,我们可以发现用1,2就可以表示出来了,1自己异或是1,2自己异或是2,1,2异或是3

因此我们就可以说1,2就是这个方程的一组解,但是线性基未必只有一组,我们设想上面那个问题,是否1,3也可以去表示所有的非0异或解呢?

答案当然是肯定的

所以,简单来说,线性基是一个数的集合,并且每个序列都拥有至少一个线性基取线性基中若干个数异或起来可以得到原序列中的任何一个数

线性基的三大性质 

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

 

但是还是有一个结论,如果求非0线性基中的第k小的数,我们可以将k转换为2进制,哪部分为1,就去base数组里第i个进行异或,最终结果就是第k小的

ps:这个方法只适用于高斯消元法,普通消元不适用

线性基的代码实现 

普通消元法 

普通消元法就是认为,有一个数组,长度最高位63位,然后我们不断读取一个新数,去看其第一位的一在哪一位,如果第一位的一所在的位数没有存数,那么就将这个数存进去,否则就用这个数去异或当前位上的那个数,不断异或,直到为0,或者找到一位,没有去存数位置 

bool solve(int x)
{for(int i=62; i>=0; i--){if(x&(1LL<<i)){if(!d[i]){d[i]=x;return true;}else x^=d[i];}}return false;
}

 类高斯消元法

 就是类似于异或高斯消元,but是个一维数组,我们用一个len去统计有效区域,我们这个高斯消元的好处就是说可以极大的节省空间,我们完全不用看有效区域外的数,我们如果我们能够找到当前寻找位上是1的,我们就可以将其作为主元加入有效区域,然后拓展有效区域

void solve()
{len=1;for(int i=bit;i>=0;i--){int p=len;for(int j=len;j<=n;j++){if((base[j]>>i)&1LL){swap(base[len],base[j]);break;}}if((base[len]>>i)&1LL){for(int j=1;j<=n;j++){if(j==len){continue;}if((base[j]>>i)&1){base[j]^=base[len];}}len++;}}len--;
}

 例题:

P3812 【模板】线性基

 

题意:就是说给你n个数,让你求最大的异或值,这不就是线性基板题,直接套用模版就好了,我这里给出的是高斯消元方法的代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int bit=60;//设置数的最高位数
int base[55];//存储线性基的数组
int len;//去统计线性基的有效区间
int n;
void solve()
{len=1;for(int i=bit;i>=0;i--){int p=len;for(int j=len;j<=n;j++){if((base[j]>>i)&1LL){swap(base[len],base[j]);break;}}if((base[len]>>i)&1LL){for(int j=1;j<=n;j++){if(j==len){continue;}if((base[j]>>i)&1){base[j]^=base[len];}}len++;}}
}signed main()
{cin>>n;for(int i=1;i<=n;i++){cin>>base[i];}solve();int d = (1LL << n) - 1; int sum = 0;
//    for(int i=1;i<=len;i++)
//    {
//    	cout<<base[i]<<"\n";
//	}for (int i = 1; i <= len; i++) {sum ^= base[i]; }cout << sum;return 0;
}

 P4570 [BJWC2011] 元素

贪心+线性基,代码虽然很短,但是思考过程还是有的,为什么从大到小排一遍然后放入线性基就是对的呢?

我们根据性质三可知,我们放入线性基的元素是固定的,也就是说,既然我们放的元素是一定的,那肯定是逮着最大的放啊,那你问,会不会因为先开始放入最大的而影响后面的,这肯定不会的啊,如果要将一个原来插入不进线性基的元素插入到线性基里面,只需要删去线性基里面的一个特定的元素就好了 

所以就是贪心+线性基

这里用的是普通消元法

#include<bits/stdc++.h>
using namespace std;
#define int long longstruct node
{int x;//编号 int y;//值 
};
node a[1010];
int n,ans=0;
int d[70];
bool cmp(node a,node b)
{return a.y>b.y;
}
bool add(int x)
{for(int i=62; i>=0; i--){if(x&(1LL<<i)){if(!d[i]){d[i]=x;return true;}else x^=d[i];}}return false;
}signed main()
{cin>>n;for(int i=1; i<=n; i++)cin>>a[i].x>>a[i].y;sort(a+1,a+n+1,cmp);for(int i=1; i<=n; i++){if(add(a[i].x))ans+=a[i].y;}cout<<ans<<'\n';return 0;
}

 #114. k 大异或和

就是说给你一个n,然后给你n个数,最后问你这n个数异或出来后,不重复的第k小的数是哪个

这题一眼线性基啊, ,但是需要用到我们上面那个第k小的结论,然后高斯消元法秒了

我们求出来的base数组是从1开始的,因此起始的是从大到小排序,因此我们需要转变一下下标位置,让其从小到大排序,然后用上面那个结论就可以过了

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m;
int base[100005];
int a[200005];
int cnt = 0;
bool flag = false;
int bit = 60;
int len = 1;
void solve() {len = 1;for (int i = bit; i >= 0; i--) {for (int j = len; j <= n; j++) {if ((base[j] >> i) & 1LL) {swap(base[len], base[j]);break;}}if ((base[len] >> i) & 1) {for (int j = 1; j <= n; j++) {if (j == len)continue;if ((base[j] >> i) & 1LL) {base[j] ^= base[len];}}len++;}}len--;if (len == n)flag = false;else if (len < n)flag = true;
}signed main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> base[i];}solve();int cnt = 0;cin >> m;int sum = 0;int d = (1LL << len) - 1;for (int i = len; i >= 1; i--) {a[cnt++] = base[i];}for (int i = 1; i <= m; i++) {cin >> cnt;if (flag == true) {cnt--;}if (cnt > d) {cout << -1 << "\n";continue;}sum = 0;for (int i = 60; i >= 0; i--) {if ((cnt >> i) & 1) {sum ^= a[i];}}cout << sum << "\n";}return 0;
}

我亲爱的小乖,我今天还是很想你,真想好好的陪你说话啊,你要加油哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432346.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HelpLook VS GitBook,在线文档管理工具对比

在线文档管理工具在当今时代非常重要。随着数字化时代的到来&#xff0c;人们越来越依赖于电子文档来存储、共享和管理信息。无论是与团队合作还是与客户分享&#xff0c;人们都可以轻松地共享文档链接或通过设置权限来控制访问。在线文档管理工具的出现大大提高了工作效率和协…

探索GPU算力在大模型和高性能计算中的无限潜能

在当今科技领域&#xff0c;大模型和高性能计算正以惊人的速度发展。大模型如语言模型、图像识别模型等&#xff0c;规模越来越大&#xff0c;精度越来越高&#xff0c;能够处理复杂的任务和生成逼真的结果。高性能计算则凭借强大的计算能力&#xff0c;推动着科学研究、工程设…

PMP与CMMI:两种管理方法的对比

PMP与CMMI&#xff1a;两种管理方法的对比 PMP&#xff1a;专注于项目管理CMMI&#xff1a;组织过程改进的框架总结&#xff1a;互补而非替代 在现代企业管理中&#xff0c;项目管理和组织能力成熟度模型集成&#xff08;CMMI&#xff09;是两个经常被提及的概念。虽然它们都是…

Java项目实战II基于Java+Spring Boot+MySQL的汽车销售网站(文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化时…

Clion使用vcpkg管理C/C++包

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Clion安装vcpkg二、使用步骤1.切换到清单模式2.开始安装包 三、测试代码总结 前言 Linux上的库基本都可以通过apt或yum等包管理工具来在线安装包&#xff…

力扣 简单 876.链表的中间结点

文章目录 题目介绍题解 题目介绍 题解 法一&#xff1a; class Solution {public ListNode middleNode(ListNode head) {ListNode cur head;int n 0;while (cur ! null) {n;cur cur.next;}ListNode curr head;for (int i 0; i < n / 2; i) {curr curr.next;}return …

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好&#xff0c;代码也耦合度也低&#xff0c;但是我有个简单的写法同样能实现一样的效果&#xff0c;所以我就充分发挥了一下主观能动性 相较于基本功能&#xff0c;这一版做出了如下改动 1.限制了对象池最大数量&#xff0c;多出来的…

【hot100-java】【括号生成】

R9-回溯篇 枚举填左括号 class Solution {private int n;private char[] path;private final List<String> retnew ArrayList<>();public List<String> generateParenthesis(int n) {this.nn;//所有括号长度都是n*2pathnew char [n*2];dfs(0,0);return ret;…

求10 个整数中最大值

我们需要10个整数之中求出10个整数之中的最大值所以我们先要将10个整数先放置到一个容器之中&#xff0c;我们初期就使用数组的形式存放10个数组即设置数组arr[10]&#xff0c;我们要将10个数组之中的数字输出出来&#xff0c;我们这里使用的是遍历循环输出数组。我们这里是使用…

Redis 字符串类型的典型应用场景

目录 1. 缓存功能 2. 计数功能 3. 共享会话&#xff08;Session&#xff09; 4. 手机验证码 前言 这里将详细介绍 Redis 字符串类型在实际开发中的几个典型应用场景&#xff0c;并提供相应的伪代码示例。 1. 缓存功能 场景描述 在许多Web应用中&#xff0c;数据通常需要…

这6个aigc软件,性价比之王

随着人工智能技术的迅猛发展&#xff0c;越来越多的应用程序开始集成AIGC&#xff08;人工智能生成内容&#xff09;功能&#xff0c;提升用户体验。本文将介绍六款实用的AIGC软件下载&#xff0c;帮助您在各个领域提高工作效率&#xff0c;释放创造力。 1、即时 AI 作为国内…

Acwing Floyd算法

Acwing Floyd算法 Floyd-Warshall 算法&#xff0c;用于解决图中任意两点之间的最短路径问题。Floyd-Warshall 是一种 多源最短路径算法&#xff0c;可以处理带正权或负权的边&#xff0c;但要求图中不能有负权回路。 通过三层循环对每个顶点作为中转点 k 进行更新。通过检查…

企业为什么要上项目管理系统?项目管理的六大核心要素

随着企业规模的不断扩大和项目数量的增多&#xff0c;传统的手工管理方式已经无法满足企业在项目管理方面的需求。项目管理系统能够帮助企业实现项目信息的集中管理&#xff0c;将所有相关的项目信息&#xff08;如任务、进度、预算、人员等&#xff09;集中存储在一个平台上&a…

【STM32】 TCP/IP通信协议(1)

一、前言 TCP/IP是干啥的&#xff1f;它跟SPI、IIC、CAN有什么区别&#xff1f;它如何实现stm32的通讯&#xff1f;如何去配置&#xff1f;为了搞懂这些问题&#xff0c;查询资料可解决如下疑问&#xff1a; 1.为什么要用以太网通信? 以太网(Ethernet) 是指遵守 IEEE 802.3 …

中国式报表制作困难?!那是因为你没选对报表工具!

一、报表工具介绍 在信息化时代&#xff0c;数据是企业决策的核心驱动力。报表工具作为数据处理与分析的重要手段&#xff0c;广泛应用于财务、销售、运营等各个领域&#xff0c;成为企业洞察市场、优化管理、提升效率的关键工具。传统上&#xff0c;报表制作依赖于复杂的编程…

AWS注册时常见错误处理

引言 创建AWS账号是使用AWS云服务的第一步&#xff0c;但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题&#xff0c;包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …

tensorflow底层架构

tensorflow底层架构 架构图 Training libraries 和 Inference libs&#xff08;训练库和推理库&#xff09; Training libraries&#xff1a;用于模型的训练过程&#xff0c;包括定义模型、计算梯度、更新模型权重等。这些库提供了在训练过程中所需的所有功能。Inference lib…

如何使用ArcGIS Pro制作地理区位图

你是否经常在网上看到别人制作的地理区位图&#xff0c;自己也跃跃欲试&#xff0c;这里为你分享一下制作方法&#xff0c;希望能对你有所帮助。 乡镇数据处理 将乡镇边界数据加载进来&#xff0c;打开符号系统&#xff0c;将所有的乡镇边界数据设置成一个颜色&#xff0c;如…

流浪软件uniaccess agent 删除

cmd的C盘找不到就用git rm -rf 之后&#xff0c;只剩下 俩文件夹删不掉 然后360软件就看到了&#xff0c;可惜卸载失败 然后360文件就找到了&#xff0c;彻底删除 再回git 查看 方法 https://blog.51cto.com/u_16099347/11352333 https://blog.csdn.net/xioayu96/article/…