密文题解(图论+字典树)

news/2024/11/7 21:13:50/

题目大意

有一段长度为nnn的密文,密文的每一位都可以用一个非负整数来描述,并且每一位都有一个权值aia_iai。你可以操作任意多次,每次操作可以选择任意一段密文,花费选择的所有位上权值的异或和的代价获得这段密文每一位的异或和。求至少需要花费多少代价才能将密文的每一位都破解出来。

数据范围

1≤n≤105,0≤ai≤1091\leq n\leq 10^5,0\leq a_i\leq 10^91n105,0ai109


题解

令前iii个未知数的异或和为xix_ixi,那么询问[l,r][l,r][l,r]就是询问xr⊕xl−1x_r\oplus x_{l-1}xrxl1的值。而知道每一个数的值等同于知道每个xix_ixi的值。

一开始,我们只知道x0x_0x0的值。对于一次询问[l,r][l,r][l,r],如果在询问之前我们已经知道xl−1x_{l-1}xl1的值或xrx_rxr的值,那么询问之后我们就能知道它们两个的值分别为多少。

将每个xix_ixi看作点iii,将询问[l,r][l,r][l,r]看作点l−1l-1l1向点rrr连一条边,那么题目就转化为求让000nnn的所有点连通的最小代价,即求最小生成树。

令前iiiaaa值的异或和为sis_isi,那么点iii到点jjj的边的边权为si⊕sjs_i\oplus s_jsisj。考虑如何求最小生成树。

我们可以把所有sis_isi放在字典树上。对于字典树上的每一个节点,它有两棵子树。只需要从两棵子树中各选一个点,使它们的异或和最小,再把它们连起来,即可将这两部分中的点连通。

那怎么选点呢?我们可以暴力枚举其中一棵子树中的数,然后在另一棵子树上贪心去找与其异或和最小的数,对所有数求最小值即可。

因为每个节点只会被其每个父亲枚举一次,所以这样做的时间复杂度为O(nlog⁡2w)O(n\log^2 w)O(nlog2w),其中wwwaia_iai的最大值。

code

#include<bits/stdc++.h>
using namespace std;
const int N=30;
int n,tot=1,tmp,a[100005],s[100005],ch[5000005][2];
vector<int>v[5000005];
long long ans=0;
void pt(int s){int q=1;for(int i=N;i>=0;i--){if(!ch[q][(s>>i)&1]) ch[q][(s>>i)&1]=++tot;q=ch[q][(s>>i)&1];v[q].push_back(s);}
}
int find(int u,int s,int now){int re=0,vq;for(int i=now-1;i>=0;i--){int vq=(s>>i)&1;if(!ch[u][vq]){re|=(1<<i);vq^=1;}u=ch[u][vq];}return re;
}
void gt(int u,int now){--now;if(ch[u][0]) gt(ch[u][0],now);if(ch[u][1]) gt(ch[u][1],now);if(ch[u][0]&&ch[u][1]){tmp=1<<N;for(int i=0;i<v[ch[u][0]].size();i++){tmp=min(tmp,find(ch[u][1],v[ch[u][0]][i],now));}ans+=tmp+(1ll<<now);}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}for(int i=0;i<=n;i++) pt(s[i]);gt(1,N+1);printf("%lld",ans);return 0;
}

http://www.ppmy.cn/news/40605.html

相关文章

spring beancopier Cannot invoke “Object.getClass()“ because “cause“ is null异常处理

我们项目用到spring beancopier, 在别的机器上运行正常&#xff0c;代码拉到我机器上就不正常了&#xff0c;抛出异常信息如题。 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.ibm.riskmeasure.rwaservice.service.singlete…

[蓝桥杯]迷宫(路径的存储和打印是关键,orz)

//存储容器&#xff1a;1&#xff1a;node father[maxn][maxn];//当前节点的父节点 2&#xff1a;struct node//*** { int x,y,d; char pos;//存储D L R U }; 具体存储&#xff1a; for(int i0;i<4;i){int toxnow.xdix[i];int toynow.ydiy[i];father[tox][toy].x…

TCP连接耗尽攻击异常报文攻击与防御

TCP连接耗尽攻击与防御 TCP是面向连接的协议&#xff0c;其通信双方必须保持连接状态&#xff0c;并且通过确认、重传、滑动窗口等机制&#xff0c;保证数据传输的可靠性和稳定性。攻击者利用 TCP 的上述特点&#xff0c;利用TCP连接消耗被攻击目标的系统资源。 连接耗尽攻击…

谈ChatGPT基本信息

ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型。 ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#…

【eMMC学习记录】emmc相关名词解释和基础概念

名词解释 NAND Flash:半导体闪存 HDD&#xff1a;机械硬盘 FW:固件 Peak Power:峰值功率 Active Power:读写功耗 Idle Power:空闲功耗 standby/sleep Power Dev Sleep Power:SSD内部休眠功耗 RAM:掉电丢失数据 FGT:浮栅晶体管 FormFactor:尺寸标准件 AFA:全闪存整列…

可视化CNN和特征图

卷积神经网络(cnn)是一种神经网络&#xff0c;通常用于图像分类、目标检测和其他计算机视觉任务。CNN的关键组件之一是特征图&#xff0c;它是通过对图像应用卷积滤波器生成的输入图像的表示。 理解卷积层 1、卷积操作 卷积的概念是CNN操作的核心。卷积是一种数学运算&#x…

医疗耗材缺陷视觉检测的应用

近年来&#xff0c;全球医疗耗材市场规模持续增长&#xff0c;GMP标准不断提高&#xff0c;用工成本不断上升。 在药品生产和包装环节&#xff0c;传统的人造灯检测方式已经不能满足生产自动化和质量控制的要求。 随着AI、医疗耗材缺陷视觉检测等新技术的发展和应用&#xff0c…

(十一)centos7案例实战——通过系统监控日志定制实现系统安全监控

前言 在实际的生产服务器环境中&#xff0c;我们常常会碰到服务器系统的安全问题&#xff0c;如何监控我们的服务器系统安全也是需要我们考虑的问题&#xff0c;由于网络攻击、恶意操作系统等等情况&#xff0c;我们需要查看这些历史操作&#xff0c;这就需要我们可以通过系统…