线性基
定义
线性基用于解决类似于: "给定
本质上还是求出多个数最大和最小的异或和,由于给出的数目较大, 如果直接一一比较的话时间复杂度较大,可以通过线性基优化, 假如有
这里介绍一下什么是线性基, 举个形象的例子来说,
算法
接下来考虑如何构造线性基, 下面通过分析两个例子
- 最小异或和
由于最小异或和就一个值, 那么不是 就是位数最小的那个数字 - 最大异或和
考虑贪心, 对于每一位的数字, 我们直接做异或看看是否增大, 若增大, 我们就直接加进去, 为什么这样是对的? 因为我们从大到小开始, 对于最大的, 肯定不会存在一个其它的数可以到达最高位. 对于次大的, 若异或后对答案有益, 我们就异或, 因为不会存在一个更大的数可以使答案更优, 换句话说, 比它小的元素任意的组合都不会比它大.
例题
下面给出例题: 线性基
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10, mod = 1e9 + 7;
signed main()
{
std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n; cin >> n;
vector<int> p(65);
bool zero;
auto insert = [&](int x) -> void{
for(int i = 61; i >= 1; i--){
if(x >> (i - 1)){
if(p[i] == 0){
p[i] = x;
return;
}
else x ^= p[i];
}
}
zero = true;
};
for(int i = 1; i <= n; i++){
int x; cin >> x;
insert(x);
}
int res = 0;
for(int i = 61; i >= 1; i--){
res = max(res, res ^ p[i]);
}
cout << res << '\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2023-07-30 砍竹子
2023-07-30 李白打酒
2023-07-30 测试1
2023-07-30 #878