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;生产环境部署也比较麻烦。因此就有了今天的这篇文章。如果你…

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

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

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

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

大吉大利【牛客网】(牛客练习赛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输出…

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

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

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

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

AspNetCore 基于AOP实现Polly的使用

前言 说起AOP&#xff0c;其实我们在做MVC/API 的时候应该没少接触&#xff0c;比如说各种的Fitter 就是典型的AOP了。本来在使用Polly的时候我最初的打算是使用过滤器来实现的&#xff0c;后来发现实现起来相当的困难&#xff0c;利用NetCore的中间以及过滤器去实现一个AOP的…

.NET Core开发日志——配置

熟悉ASP.NET的开发者一定对web.config文件不陌生。在ASP.NET环境中&#xff0c;要想添加配置参数&#xff0c;一般也都会在此文件中操作。其中最常用的莫过于AppSettings与ConnectionStrings两项。而要在代码中获得文件中的配置信息&#xff0c;ConfigurationManager则是必不可…

操作集锦【牛客网】 牛客练习赛60

题目传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 有一款自走棋有26种操作,每种操作我们都用a,b,c,d,…,x,y,z的符号来代替. 现在牛牛有一个长度为nnn的操作序列,他现…

解决C# 7.2中的结构体性能问题

在某些使用了readonly关键字的情况下&#xff0c;C#编译器会创建出结构体的防御副本。虽然这个问题已经众所周知并被记录下来了&#xff0c;但仍然值得重新审视&#xff0c;因为它与C# 7.2的几个特性有关。in和ref readonly关键字的使用让这个问题出现得更频繁&#xff0c;而re…

使用ML.NET实现基于RFM模型的客户价值分析

RFM模型在众多的客户价值分析模型中&#xff0c;RFM模型是被广泛应用的&#xff0c;尤其在零售和企业服务领域堪称经典的分类手段。它的核心定义从基本的交易数据中来&#xff0c;借助恰当的聚类算法&#xff0c;反映出对客户较为直观的分类指示&#xff0c;对于没有数据分析和…

Reordering the Cows

牛客网传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 链接&#xff1a;https://ac.nowcoder.com/acm/contest/4860/B 来源&#xff1a;牛客网 题目描述 Farmer John’s N cows (…

回顾4180天在腾讯使用C#的历程,开启新的征途

今天是2018年8月8日&#xff0c;已经和腾讯解除劳动关系&#xff0c;我的公司正式开始运营&#xff0c;虽然还有很多事情需要理清&#xff0c;公司官网也没有做&#xff0c;接下来什么事情都需要自己去完成了&#xff0c;需要一步一个脚印去完善&#xff0c;开启一个新的征途。…

稳定工作和创业之间的抉择

早上写的文章《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》是我在腾讯写的最后一篇对过往10年在腾讯使用C#语言的总结&#xff0c;今天收到反馈有人在造谣腾讯开始去.net&#xff0c;我被迫辞职了。这非常的不负责任&#xff0c;我必须写这篇文章来辟谣。要说腾讯…

牛客2020年愚人节比赛

欢乐的一晚上 题目链接 其实做做也挺好&#xff0c;脑筋急转弯&#xff0c;不需要算法不需要数据结构&#xff0c;纯娱乐 还有不知道是哪位哥的&#xff0c;心疼一下 题解 注&#xff1a;一下题解没必要较劲&#xff0c;欢乐局而已 对不对无所谓&#xff0c;换了最重要奥 A题ra…

IdentityServer4 知多少

1. 引言现在的应用开发层出不穷&#xff0c;基于浏览器的网页应用&#xff0c;基于微信的公众号、小程序&#xff0c;基于IOS、Android的App&#xff0c;基于Windows系统的桌面应用和UWP应用等等&#xff0c;这么多种类的应用&#xff0c;就给应用的开发带来的挑战&#xff0c;…

牛客网【每日一题】4月2日 月月查华华的手机

牛客网链接 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 月月和华华一起去吃饭了。期间华华有事出去了一会儿&#xff0c;没有带手机。月月出于人类最单纯的好奇心&#…

【二分】Best Cow Fences(poj 2018)

Best Cow Fences poj 2018 题目大意&#xff1a; 给出一个正整数数列&#xff0c;要你求平均数最大&#xff0c;长度不小于M的字串&#xff0c;结果乘1000取整 输入样例 10 6 6 4 2 10 3 8 5 9 4 1输出样例 6500数据范围 1⩽N⩽100,0001\leqslant N \leqslant 100,0001⩽…

离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习

离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习 说在前边 最近复习\(DSP\)的时候&#xff0c;发现了一个号称专门针对离散实序列的变换&#xff0c;经分析总运算量为普通\(FFT\)的几乎一半&#xff0c;而且完全没有复数。这么强的吗&#xff1f;于是花了一个下午&#xff0c;去…

.NET Core 2.1中的分层编译(预览)

如果您是.NET性能的粉丝&#xff0c;最近有很多好消息&#xff0c;例如.NET Core 2.1中的性能改进和宣布.NET Core 2.1&#xff0c;但我们还有更多的好消息。分层编译是一项重要的新特性功能&#xff0c;我们可以作为预览供任何人试用&#xff0c;从.NET Core 2.1开始。在我们测…