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

这篇具有很好参考价值的文章主要介绍了密文题解(图论+字典树)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目大意

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

数据范围

1 ≤ n ≤ 1 0 5 , 0 ≤ a i ≤ 1 0 9 1\leq n\leq 10^5,0\leq a_i\leq 10^9 1n105,0ai109


题解

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

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

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

令前 i i i a a a值的异或和为 s i s_i si,那么点 i i i到点 j j j的边的边权为 s i ⊕ s j s_i\oplus s_j sisj。考虑如何求最小生成树。

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

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

因为每个节点只会被其每个父亲枚举一次,所以这样做的时间复杂度为 O ( n log ⁡ 2 w ) O(n\log^2 w) O(nlog2w),其中 w w w a i a_i ai的最大值。文章来源地址https://www.toymoban.com/news/detail-536866.html

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;
}

到了这里,关于密文题解(图论+字典树)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • B3610 [图论与代数结构 801] 无向图的块 题解

    2023 2023 2023 ,再见。 2024 2024 2024 ,你好! 其实就是统计点双连通分量的个数。需要注意的是,孤立点在这里不被看作块。本文使用 tarjan 算法来解决这道题。 概念明晰 时间戳:这里记为 d f n i dfn_i df n i ​ ,表示第一次深度优先搜索到节点 i i i 的时间。时间 t i m e ∈ N + t

    2024年02月03日
    浏览(41)
  • Cookie和会话安全,编码方式及其密文特征

    (本文章仅支持本人学习使用,若造成不良影响,与本人无关!)         Cookie 是 Web 服务端发送给用户浏览器的一小段数据, 浏览器会存储这些数据 ,并在后续发往服务器的请求中带上它们。         Cookie 是一种将数据存储在客户端的方式,我们可以通过 Cookie 将用

    2024年01月20日
    浏览(39)
  • 密码学系列4-选择密文安全,同态加密安全性

    本章将介绍Cramer-Shoup加密方案,并证明其安全性。最后讨论了同态加密方案的安全性证明 一、Cramer-Shoup加密 密钥生成 1.定义群 G G G ,群的阶为 q q q ,选取群的生成元

    2024年04月26日
    浏览(32)
  • Objective-C使用UISwitch控制UITextField显示明文或密文

    1.xib中设计 2.关联控件   3.使用代码控制开关与TextField显示模式  4.开关控件UISwitch点击事件实现,点击时根据状态切换TextField显示模式 5.显示效果:  

    2024年02月01日
    浏览(47)
  • 思科模拟器:交换机&路由器 密码设置(明文&密文&加密明文)

    环境:思科模拟器 一个路由器一个交换机 两者密码配置一样!!!!!!!!!!! 两者密码配置一样!!!!!!!!!!! 两者密码配置一样!!!!!!!!!!! 均为 console 口密码 还有 进入特权模式密码 这是没有配置密码的直接进入 进入特权密码配置 全局模式

    2024年02月07日
    浏览(54)
  • 微信小程序中获取用户手机号密文数据解密报错问题

    微信小程序获取手机号,官方通常会返回密文数据给我们,此时就需要我们自行解密数据。在揭秘的数据过程中会发现,第一次授权获取手机号会出现错误,再次获取的时候就能够正常获取。 错误信息一般分两种: 密文后端解密的 javax.crypto.BadPaddingException: pad block corrupted(后

    2024年02月15日
    浏览(61)
  • RSA算法习题 (采用RSA算法,其中e=7,p=11,q=13,求出公钥和私钥,并求出明文85进行加密后的密文。)

    1、采用RSA算法,其中e=7,p=11,q=13,求出公钥和私钥,并求出明文85进行加密后的密文。 2. 找出质数 P、Q P=11 Q=13 3. 计算公共模数 N = P * Q = 143 4. 欧拉函数 Φ(N) = (P-1)*(Q-1) = 10 *12 = 120 5. 计算公钥E 1Eφ(N) 所以1E120 E的取值范围{3,7,9,11,13,17,19,...,117,119} E的取值必须和φ(N)互质 取

    2024年02月09日
    浏览(91)
  • 密码学——Hill体制密码中已知明文M和密文C求解密钥矩阵K的两种方法之逆矩阵求解法和待定系数求解法

    本文主要解决古典密码中的Hill体制密码在已知明文M和密文C的情况下求解密钥矩阵K的两种方法:①求逆矩阵②待定系数法。 如若不懂Hill体制的古典密码可以参照我上一篇文章密码学——几种典型的古典密码体制(Caesar体制、Playfair体制、Vigenere体制、Beaufort体制以及Hill体制)

    2024年02月02日
    浏览(61)
  • 【RSA加密/解密】PKCS1_OAEP和PKCS1_v1_5两种填充方案【python RSA密钥对生成、密码加密、密文解密、pycharm安装Crypto】

    一、PKCS1_OAEP和PKCS1_v1_5是公钥加密标准中的两种填充方案。 PKCS1_OAEP(Optimal Asymmetric Encryption Padding)是一种更安全的填充方案,它提供了更好的安全性和抗攻击性。它使用随机数进行填充,并引入了哈希函数来增加安全性。 PKCS1_v1_5是较旧的填充方案,它使用固定的填充字节序

    2024年02月06日
    浏览(58)
  • Python 字典 get()函数使用详解,字典获取值

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 get() 可以根据键 「获取值」 语法 参数 key :(必选)指定要搜索的键 value :(可选)如果键不存在,就返回

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包