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

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

思路:
首先讲个小例题:

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

最暴力的方法无疑是(老办法) 枚举,枚举每一个b,但这样肯定不行~~(不然我写这个博客干什么)~~ ,想想计算机的本质是啥?对,二进制。我们把a与这堆数转化成二进制,把后面这堆数装进一个字典树,当然要从最高位装,比如这堆数是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;
}

CodeForces 282E Sausage Maximization(trie+xor)相关推荐

  1. codeforces 282E Sausage Maximization

    题目链接:http://codeforces.com/problemset/problem/282/E 题意:给出一个数列A,选择A的一个前缀s1和一个后缀s2,使得s1的抑或值和s2的抑或值的抑或值 ...

  2. LeetCode 1707. 与数组中元素的最大异或值(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个由非负整数组成的数组 nums .另有一个查询数组 queries ,其中 queries[i] = [xi, mi] . 第 i 个查询的答案是 ...

  3. LeetCode 616. 给字符串添加加粗标签(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给一个字符串 s 和一个字符串列表 dict ,你需要将在字符串列表中出现过的 s 的子串添加加粗闭合标签 <b> 和 </b> ...

  4. LeetCode 758. 字符串中的加粗单词(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个关键词集合 words 和一个字符串 S,将所有 S 中出现的关键词加粗.所有在标签 <b> 和 </b> 中的字母都会加 ...

  5. 字符串匹配算法(Trie树)

    文章目录 1. Trie树概念 2. Trie树操作 2.1 存储 2.2 查找 2.3 插入 2.4 删除 2.5 打印 3. 完整代码 4. Trie树与散列表.红黑树的比较 4.1 思考题 参考 ...

  6. Codeforces 1077B Disturbed People(思维题)

    Codeforces 1077B Disturbed People(思维题) There is a house with nn flats situated on the main street of ...

  7. C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码

    分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注.句法分析.词向量以及文本分析的质量.英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下 ...

  8. 字典树(Trie tree)

    Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字 ...

  9. [Bzoj4260]Codechef REBXOR(trie树)

    4260: Codechef REBXOR Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1534  Solved: 669 [Submit][St ...

最新文章

  1. 读取jar包资源代码赏析
  2. 今年Java面试必问的这些技术面,看完这一篇你就懂了
  3. ckeditor 4.2.1_演示 ckeditor 上传插入图片
  4. 数据库操作之增删改查CRUD
  5. Java 容器集合框架概览
  6. 原生js路由跳转方法_今日艰难笔记原生js整合reactrouter路由管理
  7. python系统目录_Python创建系统目录的方法
  8. Java bytecode instruction listings
  9. java的xml面试题_Java程序员的10个XML面试问答
  10. 基于注解的Spring MVC与JPA如何解决实体的延时加载问题
  11. 如何修复MySQL配置文件?
  12. 高性能Nginx服务器+互联网高并发解决方案+安全架构 蚂蚁学堂互联网架构师课程
  13. WIN11 TortoiseSVN 无论什么操作,都报同一个错误:请求的操作需要提升
  14. xmlhttp.readyState的值及解释
  15. 三色旗的C语言算法,从算法学起C语言--三色旗问题
  16. 指甲半月痕的奥秘!!
  17. 关闭公司电脑的强制屏幕保护
  18. 幻灯片放映时无法切换到下一张
  19. AcWing 860. 染色法判定二分图 (染色法)
  20. 免费ARP(gratuitousARP)

热门文章

  1. 再生希尔伯特空间_向量、函数向量、再生核希尔伯特空间、核技巧
  2. pythonlive2d_Unity-Live2D资源载入
  3. cass小插件集合_插件|如何精准提取CASS方格网高程点?
  4. css规则中区块block,CSS的命名方式:BEM(区块、元素、修饰符)
  5. 网站底部运行时间的php代码,网站底部运行时间统计代码
  6. MVC三层架构(详解)
  7. 「软件项目管理」一文详解软件配置管理计划
  8. [mybatis]映射文件_参数处理
  9. C++实现各种排序以及复杂度,稳定性分析
  10. [Java基础]HashSet集合概述和特点