查看“︁05-算法模板/07-线性基”︁的源代码
←
05-算法模板/07-线性基
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
线性基可以用于处理'''异或'''相关问题,如求最大异或和、第 <math>k</math> 小异或和等。 == 模板 == [https://oj.33dai.cn/p/P3812 P3812. 【模板】线性基] 给定 <math>n</math> 个整数(数字可能重复),求在这些数中选取任意个,使得它们的异或和最大。 <syntaxhighlight lang="cpp"> #include <bits/stdc++.h> using namespace std; const int MAXL = 50; 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--) { if (!t) return; if (!(t & (1ll << j))) continue; if (a[j]) t ^= a[j]; else { for (int k = 0; k < j; k++) if (t & (1ll << k)) t ^= a[k]; for (int k = j + 1; k <= MAXL; k++) if (a[k] & (1ll << j)) a[k] ^= t; a[j] = t; break; } } } void build(long long *x, int n) { std::fill(a, a + MAXL + 1, 0); for (int i = 1; i <= n; i++) insert(x[i]); } long long queryMax() { long long res = 0; for (int i = 0; i <= MAXL; i++) res ^= a[i]; return res; } void mergeFrom(const LinearBasis &other) { for (int i = 0; i <= MAXL; i++) insert(other.a[i]); } }; int main() { ios::sync_with_stdio(false); cin.tie(0); long long n, x; cin >> n; LinearBasis lb; for (int i = 1; i <= n; i++) { cin >> x; lb.insert(x); } cout << lb.queryMax() << "\n"; return 0; } </syntaxhighlight> == 使用说明 == - <code>insert(x)</code>:向线性基中插入一个数 <math>x</math> - <code>queryMax()</code>:查询能表示出的最大异或和 - <code>mergeFrom(other)</code>:合并另一个线性基 时间复杂度:插入 <math>O(\log \max)</math>,查询 <math>O(\log \max)</math>。 [[Category:算法模板]] [[Category:三三文档]]
返回
05-算法模板/07-线性基
。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息