CodeForces 282E Sausage Maximization(trie+xor)

传送题目
看了半个多小时的题解才搞明白,一下题解为自己的心得
参考博客(这两个讲的很详细):
参考一
参考二

题意:有一个长度有n的整数序列,你要在这个序列中选择一个前缀和后缀,前后缀不想交,前后缀任何一方都可以为空,问你前缀异或值与后缀异或值的异或最大是多少?
比如 一组数 1 2 3 4 5 6 你可以选择前缀为1 2,前缀异或和为3 选择后缀为4 5 6,后缀异或和为7
(前缀异或和)与(后缀异或和)异或值为4,但此时4并不是最大情况,求出最大情况

思路:
首先讲个小例题:

给一个数 a,还有一堆数,怎么在这一堆数中找出一个数 b,a 和 b 的异或值最大?

最暴力的方法无疑是(老办法) 枚举,枚举每一个b,但这样肯定不行~~(不然我写这个博客干什么)~~ ,想想计算机的本质是啥?对,二进制。我们把a与这堆数转化成二进制,把后面这堆数装进一个字典树,当然要从最高位装,比如这堆数是123456,如图这堆数是123456根据异或规则不同为一,所以我们要使a与b异或最大,就要让b尽可能与a不同,a已经给定,b已经形成字典树,我们就从字典树root开始,尽量找出于a当前位置不同的数,直到找到最低位为止,那么这样找到的b满足条件。

回到这个题:
首先这些n个数组成一个区间w,w的全部异或结果是定值K,所以问题可以改成在区间w中取连续一段区间m,m的异或结果为X,m的前部分就成为区间w的前缀,后半部分就是区间w的后缀。
我们知道相同的数异或为零,那么X与K异或,重复的那部分区间异或后为零,就相当于是我们题目所求的
,所以就是求什么情况下X xor K最大。
发现现在的情况和一开始讲的例题很像了吧,我们假设有个Y,Y与K的每一个二进制相异,我们就要让X尽可能接近Y。
怎么实现呢?也是建一个字典树,将f[i]放进去(f[i]=a[1] ^ a[2] ^ a[3] ^ …^ a[i]),那么f[i]^f[j]=a[i+1] ^ a[i+2] ^ … ^aj可以表示i+1到j这段区间的异或值。
我们枚举区间m的结尾,每次用一个f[i]去匹配一个f[k],使得f[k]^f[i]的值在高位上尽可能去接近Y,这样就相当于选出区间[k+1,i]de异或值作为X,每次在[1,i]区间内匹配出来一个最佳区间后,不断更新答案。
看懂了吗?这些神奇的操作,巧妙利用字典树(工具人石锤)来匹配。
(太晚了就不重新打代码了,借用下参考一的代码)

//范围是10的12次方,我们就将每个数固定为40位
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,j,k) for(int i = j; i <= k; i++ )
#define Rrep(i,j,k) for(int i = j; i >= k; i-- )
#define Clean(x,y) memset(x,y,sizeof(x)) 
int n;
LL a[100009];
LL temp;
LL ans;LL p[45];
int aim[45];
int Next[1000000][2];
int len;
void init()
{Clean(Next,0);len = 0;
}
void insert(LL t)
{int now = 0;int k;Rrep(i,39,0){if ( p[i] & t ) k = 1;else k = 0;if ( !Next[now][k] ) Next[now][k] = ++len;now = Next[now][k];}
}LL query(LL t)
{int now = 0;LL ans = 0;int k;Rrep(i,39,0){if ( p[i] & t ) k = 1;else k = 0;if ( ( aim[i] && Next[now][1-k] ) || ( !aim[i] && Next[now][k] )  ){ans+=p[i];now = aim[i]==1?Next[now][1-k]:Next[now][k];}else now = aim[i]==0?Next[now][1-k]:Next[now][k];}return ans;
}int main()
{p[0] = 1;rep(i,1,40) p[i] = p[i-1]<<1;while(scanf("%d",&n)==1){a[0] = 0;ans = 0;rep(i,1,n){scanf("%I64d",&temp);a[i] = temp ^ a[i-1];}ans = max(ans,a[n]);rep(i,0,39)if ( a[n] & p[i] ) aim[i] = 0; //计算Yelse aim[i] = 1;init();insert(a[0]); rep(i,1,n){insert(a[i]);ans = max(ans,query(a[i]));}cout<<ans<<endl;}return 0;
}

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

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

相关文章

Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

Net Core平台灵活简单的日志记录框架NLog初体验前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblogs.com/yilezhu/p/9339017.html]" 有人说比较重量&#xff0c;生产环境部署也比较麻烦。因此就有了今天的这篇文章。如果你…

jzoj5365-[GDOI2018模拟9.14]通信【线段树合并】

正题 题目大意 nnn个节点的一棵树&#xff0c;随机选择一个区间&#xff0c;求这个区间的点所构成的虚树的期望权值和。 解题思路 考虑每一条边的贡献&#xff0c;定义一边的点为黑点&#xff0c;一边的为白点&#xff0c;显然包含黑白的区间都会产生贡献。考虑减去没有贡献的…

HDU5129 - Yong Zheng's Death

HDU5129 - Yong Zhengs Death 做法&#xff1a;看题之后&#xff0c;就想到要建好trie树&#xff0c;然后输出非根节点数的平方&#xff0c;这样显然错了。因为会出现重算的情况&#xff0c;即&#xff1a;你有 ab,cde ,abc,de, abcd, e,这几个串那么 [ab, cde] [abc,de] [abcd…

牛客网【每日一题】3月27日 数学考试

题号 NC15553 名称 数学考试 来源 2018年长沙理工大学第十三届程序设计竞赛 链接&#xff1a;https://ac.nowcoder.com/acm/problem/15553 来源&#xff1a;牛客网 试题传送门 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;…

【SPFA】重建道路(jzoj 1212)

重建道路 jzoj 1212 题目大意&#xff1a; 有一个图&#xff0c;其中的一些路坏了&#xff0c;为了从a走到b&#xff0c;问最少修复多长的路 输入样例 3 2 1 2 1 2 3 2 1 1 2 1 3输出样例 1数据范围 2⩽N⩽1002\leqslant N\leqslant 1002⩽N⩽100 N−1⩽D⩽M⩽N∗(N−1)/…

ASP.NET CORE 根据环境变量支持多个 appsettings.json

0.背景在开发项目的过程当中&#xff0c;生产环境与调试环境的配置肯定是不一样的。拿个最简单的例子来说&#xff0c;比如连接字符串这种东西&#xff0c;调试环境肯定是不能连接生产数据库的。在之前的话&#xff0c;这种情况只能说是你 COPY 两个同名的配置文件来进行处理。…

GYM101933I - Intergalactic Bidding

GYM101933I - Intergalactic Bidding 题解&#xff1a;不考虑首先显然是个背包&#xff0c;一开始直接用set模拟&#xff0c;然后map存方案&#xff0c;这样会mle。发现物品的体积有的特殊性 only one participant was allowed to make a bid at a time, each participant was …

【结论】【dfs】费解的开关(joyoi-tyvj 1266)

费解的开关 joyoi-tyvj 1266 题目大意&#xff1a; 有5*5的一个图&#xff0c;每个点的数值是1或0&#xff0c;如果将一个点的数值取反&#xff0c;那这个点上下左右的点都会取反&#xff0c;现在问你将所有点都变为1最少要多少步&#xff0c;如果步数大于6或无法全变成1的话…

P3586-[POI2015]LOG【线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P3586 题目大意 nnn个数&#xff0c;有操作 修改一个数假如每次选出ccc个正数让它们减去111&#xff0c;求能否进行操作sss次。 解题思路 如果有cntcntcnt个数大于sss那么有解当且仅当满足cnt≥ccnt\geq ccnt≥c或者小于sss…

小G的项链(Manacher)

我看网上也没有写这个题的&#xff0c;顺便写一下&#xff08;可能是大佬都觉得太简单了 &#xff09; 链接&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述…

基于Win10极简SonarQube C#代码质量分析

博客有些好些时间未更新了&#xff0c;这几个月的时间里&#xff0c;离开了实习的公司、大学毕了业、来了新公司、转了户口&#xff0c;有点忙&#xff0c;最近总算稍微闲下来了&#xff0c;打算重新拾起博客&#xff0c;坚持写下去。言归正转&#xff0c;什么是SonarQube ?So…

2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲

2018年牛客多校算法寒假训练营练习比赛&#xff08;第一场&#xff09;C. 六子冲 题目链接 做法&#xff1a;模拟即可 #include <bits/stdc.h> #define P pair<int,int> #define fir first #define sec second #define rep(i,a,b) for(int ia;i<b;i) using name…

YbtOJ#20078-[NOIP2020模拟赛B组Day7]路径之和【分治,Flody】

正题 题目链接:http://noip.ybtoj.com.cn/contest/108/problem/4 题目大意 nnn个点&#xff0c;每次只封闭一个点&#xff0c;求剩下点对两两之间的最短路和。 解题思路 FlodyFlodyFlody中如果枚举kkk时不管某一个点&#xff0c;那么就可以求不经过那个点的路径。考虑分治求解…

大吉大利【牛客网】(牛客练习赛60)

传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 输入描述: 第一行一个整数n. 第二行n个整数ai. 输出描述: 一个整数表示上述求和式的答案. 示例1 输入 5 1 2 3 4 5输出…

【差分】Tallest Cow(poj 3263/luogu 2879)

Tallest Cow poj 3263 luogu 2879 题目大意&#xff1a; 现在有n头牛&#xff0c;两头牛如果要相互看到&#xff0c;那他们之间的牛必须比他们两低&#xff0c;现在给出n&#xff0c;最高牛的位置和高度&#xff0c;和m对关系&#xff0c;要你求每头牛最高是多少 输入样例…

【项目管理】git和码云的使用

缘起说了那么多关于git和码云相关的事&#xff0c;一直都没给大伙讲解这个码云究竟是个啥玩意儿。今天就给大伙说说如何通过git和码云搭建属于自己的代码库。码云码云(GitOSC)是开源中国社区团队推出的基于Git的快速的、免费的、稳定的在线代码托管平台,不限制私有库和公有库数…

牛客网暑期ACM多校训练营(第十场)F.Rikka with Line Graph

牛客网暑期ACM多校训练营&#xff08;第十场&#xff09;F.Rikka with Line Graph 做法&#xff1a;\(G\) 中的对应原图两条边(a,b) (c,d)的最短路为:\[ w[a][b] w[c][d] 2* min(dis[a][c], dis[a][d], dis[b][c], dis[b][d])\] 其中\(dis[i][j]\)表示原图G中i 到 j 的最短路…

AT2165-[AGC006D]MedianPyramidHard【二分,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/AT2165 题目大意 nnn行的一个金字塔&#xff0c;第iii层有2i−12\times i-12i−1个格子&#xff0c;每个格子是它左右下的中位数。给出最下面的2n−12n-12n−1个数&#xff0c;求第一行的数。 解题思路 我们先二分一个答案&a…

三角形周长和【牛客网】牛客网练习赛60

题目传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 输入描述: 输入描述 第一行一个整数表示n. 接下来n行每行两个整数x,y表示一个点. 输出描述: 输出一个整数表示周长…

【二分】递增(luogu 3902)

递增 luogu 3902 题目大意&#xff1a; 给出一个序列&#xff0c;问最少修改多少个数字可以使他单调递增 输入样例 3 1 3 2输出样例 1 数据范围 对于50% 的数据&#xff0c;N≤103N \le 10^3N≤103 对于100% 的数据&#xff0c;1≤N≤105,1≤Ai≤1091 \le N \le 10^5 , …