P3812 【模板】线性基

news/2025/1/24 16:15:17/文章来源:https://www.cnblogs.com/LG017/p/18689694

P3812 【模板】线性基

题目描述

给定 \(n\) 个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。

输入格式

第一行一个数 \(n\),表示元素个数

接下来一行 \(n\) 个数

输出格式

仅一行,表示答案。

提示

$ 1 \leq n \leq 50, 0 \leq S_i < 2 ^ {50} $

Solution:

想写P3857 [TJOI2008] 彩灯 的解题报告,但是发现我线性基模板题的解题报告都没写。所以我来补线性基了捏。

先要知道线性基是什么,它通常用来解决一些数任选 \(k\) 个的最大异或和。我们发现这个问题显然是满足贪心的,我们只需要让高位尽可能是1就好了,我们利用这个性质来构造一个数组 \(base\) 表示如果希望这一位 \(i\) 取 1 ,那么就应该进行 \(ans\) XOR $ base_i$ 这一操作。

然后我们再来说一下 \(base\) 怎么构造:
在插入一个数 \(x\) 时,我们分为两种情况:
如果 \(base_i=0\) 那么 \(base_i=x\)
但是如果 \(base_i!=0\),x仍然会对更低位有贡献,但这个贡献并非 \(x\),而是 \(x\) XOR \(base\)。我们来思考一下为什么:

线性基的本质其实是将这些数的本质不同的 XOR 和用一个 n 维的基底表示出来,那么为了满足贪心,我们应该保证基底的每一维 \(base_i\) 不会对高位产生影响。在不考虑高位影响的情况下,在第 \(i\) 位有两个数 \(x,y\) 只考虑他们在 \([1,i]\) 位的影响,所以认为 \([i+1,n]\) 位全是0。然后假设 \(base_i,base_j,j<i\) 为x,y对于 \(base\) 的贡献那么我们可能产生的贡献可以表达为:

\(x=base_i\)
\(x\) XOR \(y\) \(=base_j\)
\(y=base_i\) XOR \(base_j\)

又因为异或运算满足结合律和交换律,所以我们就可以认为为上述式子对于两个及以上的数构造线性基时都是成立的。也就是说,现在我们通过线性基构造出了所有可能的异或和的结果。然后我们只需要在答案统计时将 \(ans\)\(ans\) XOR \(bsse_i\) 取 max就好了。

Code:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=100;
int n;
int d[N],qpow[N];
void init()
{qpow[0]=1;for(int i=1;i<=60;i++){qpow[i]=qpow[i-1]<<1;}
}
void ins(int x)
{for(int i=60;i>=0;i--){if(x&qpow[i]){if(!d[i]){d[i]=x;break;}else {x^=d[i];}}}return ;
}
int query_max()
{int ans=0;	for(int i=60;i>=0;i--){if((ans^d[i])>ans)ans=ans^d[i];}return ans;
}
void work()
{init();cin>>n;for(int i=1,x;i<=n;i++){scanf("%lld",&x);ins(x);}int ans=query_max();printf("%lld",ans);
}
#undef int 
int main()
{work();
}

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

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

相关文章

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, released Jan 22, 2025 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/ 查看最新版。…

VS.net中快捷键收缩和展开代码段

i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再折叠了) iii. Ctrl-M-M 折叠或展开当前方法 iv. Ctrl-M-L展开所有方法 其他的快捷方式:怎样跳转到指定的某一行? 两种方法:Ⅰ. Ctrl+G Ⅱ. 双击状态栏中的行号2.. 怎样创建矩形选区? 两…

查看Resources.resx的三种方式

同一个Resources.resx文件在Visual Studio 中可以以多种方式查看, 但某一天遇到了问题, 只能以资源浏览器的方式查看, 期初还以为是Visual Studio升级加入的新功能, 怎么都无法打开设计器, 在Resources.resx文件右键菜单中看不到下面的菜单项,经过一些列的摸索, 发现设置…

Vmware 虚拟机克隆注意事项-CentOS7

1.克隆后修改MAC地 2.修改 UUID,UUID克隆虚拟机后一般是一样的,需要进行修改 输入命令uuidgen,将生成的UUID写入ifcfg-ens33 【文件位置:/etc/sysconfig/network-scripts/ifcfg-ens33】 【我克隆的时候并没有修改,但是也一样可以联网,不知道为啥】 3.修改主机名 先临时修…

autocad Ribbon创建的一种新思路

之前开发的功能相对简单, 一个RibbonTab就把相关的功能展示出来了。 目前着手准备开发的功能, 需要多个RibbonTab, 且不想显示AutoCAD或Civil 3D自身的RibbonTab, 曾经想模拟3d3s的样子来切换RibbonTab, 但发现3d3s是将AutoCAD原生的Cuix和自己的RibbonTab结合到一起, 对…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。 分布式网关的特点(相对于本地网关):提供服务路由能力 提供各种拦截支持1、分布式网关推荐 建议使用专业的分布…

Mac安装Prometheus + Grafana

一、安装Prometheus 1、下载安装 brew install prometheus2、安装路径 /opt/homebrew/Cellar/prometheus/3.1.0 3、修改配置文件 默认配置文件路径:/opt/homebrew/etc/prometheus.yml global:scrape_interval: 15sscrape_configs:- job_name: "prometheus"static_co…

Python基础6——装饰器(续) 递归 模块

1.函数1.1 参数当默认参数的值为可变类型时慎用# 不推荐使用以下代码 def func(data, value=[]):pass可以将默认参数的值改为None# 推荐使用以下代码 def func(data, value=None):if not value:value = []案例def func(data, value=[]):value.append(data)return valuev1 = fun…

C# Winform 在 Pancel 上绘制矩形

在C#的WinForms应用程序中,Panel控件本身不直接支持绘图功能,因为它不是一个绘图控件。不过,你可以通过在Panel上覆盖(override)OnPaint方法或者使用Graphics对象来在Panel上绘制图形。下面是如何实现这两种方法的示例: 方法1:覆盖OnPaint方法 可以通过重写Panel的OnPai…

SpringBoot使用SSE流,打tar包发版后出现问题

SpringBoot使用SSE流,打tar包发版后出现问题 以下纯个人实践,如有问题,还望指正~ 出现的问题 出现原因:本地调试SSE推送数据没有问题,但是通过打包为tar包发版之后,出现了以下报错: 主要问题就是: java.lang.IllegalArgumentException: Async support must be enabled …

【每日一题】20250124

读书就是这样好,无论心不在焉,板着长脸,只要考试及格,就是一个及格的人。【每日一题】 1.(20分) \(\hspace{0.6cm}\)如图所示,质量 \(M=2 \; \mathrm{kg}\) 的滑块套在光滑的水平轨道上,质量 \(m=1 \; \mathrm{kg}\) 的小球通过长 \(L=0.5 \; \mathrm{m}\) 的轻质细杆与…

Golang sync.pool源码解析

sync.Pool 是 Go 中用于对象复用的工具,可减少频繁创建和销毁对象的开销,从而优化内存使用和降低 GC 压力。本文通过分析其用法、真实案例及源码结构,详细解读了 sync.Pool 的读写流程及其背后的高效设计思想,为性能优化提供了实用参考。Golang sync.pool源码解析 - sync.p…