题意简介

题目就是叫你找两个不重合的非空区间,使得这两个区间里的数异或后相加的和最大

(看到异或,没错就决定是你了可持久化trie!)

思路

水一波字典树,莫名觉得这题可持久化能过,于是水了一发挂了,造了一波数据,然后发现是自己在做完一遍可持久化之后cnt 没有清零....

其实要用可持久化trie 来做的话也就是常规操作(话说普通字典树不也是常规操作?)

也就是前缀和往可持久化trie 上update , 然后每个 L[i]、R[i] 记录当前点为右(左)区间的最大区间异或和

然后就是枚举断点了,考虑我们枚举到的断点前的那个区间其实是确定的(异或和最大的那个),

那么我们拿当前断点作为第二个 区间的左端点,前面的区间由 lef 变量不断更新,最后就能累加出答案。

于是没什么好说的了,板子题。

代码如下

 //by Judge
#include<iostream>
#include<cstdio>
using namespace std;
const int M=4e5+;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-''; return x*f;
}
int n,cnt,a[M],L[M],R[M];
int d[],rt[M<<],son[M<<][],sum[M<<];
inline void split(int k){ //换二进制
int i,len=;
while(k) d[++len]=k&,k>>=;
for(int i=len+;i<=;++i) d[i]=;
}
inline void update(int& now,int las){ //可持久化的更新
sum[now=++cnt]=sum[las]+;
int i,tmp=now;
for(i=;i;--i){
son[tmp][d[i]^]=son[las][d[i]^],
son[tmp][d[i]]=++cnt,las=son[las][d[i]],
sum[tmp=cnt]=sum[las]+;
}
}
inline int query(int u,int v){ //询问区间内与当前数的最大异或和
int ans=,i;
for(i=;i;--i){
if(sum[son[v][d[i]^]]-sum[son[u][d[i]^]]>)
ans|=(<<i-),u=son[u][d[i]^],v=son[v][d[i]^];
else u=son[u][d[i]],v=son[v][d[i]];
} return ans;
}
int main(){ //分函数都是常规操作(因为我都是直接搞了自己的板子)
int x,lef,res=;
n=read(),++n;
split(),update(rt[],rt[]);
for(int i=;i<=n;++i)
a[i]=read();
for(int i=,sum=;i<=n;++i){
split(sum^=a[i]),
update(rt[i],rt[i-]),
L[i]=query(rt[],rt[i]);
}
cnt=,split(),update(rt[],rt[]); //清零,从后往前再来一遍
for(int i=n,sum=;i>=;--i){
split(sum^=a[i]);
update(rt[n-i+],rt[n-i+]),
R[i]=query(rt[],rt[n-i+]);
} lef=L[];
for(int i=;i<=n;++i){ //从左到右处理答案
res=max(res,lef+R[i]),
lef=max(lef,L[i]);
} printf("%d\n",res); return ;
}

Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...的更多相关文章

  1. 算法笔记--字典树(trie 树)&& ac自动机 && 可持久化trie

    字典树 简介:字典树,又称单词查找树,Trie树,是一种树形结构,是哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较. 性质:根节点不包含字符,除根节点外每一个 ...

  2. HDU 1251 Trie树模板题

    1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...

  3. Codeforces 633C Spy Syndrome 2 | Trie树裸题

    Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...

  4. poj3630 Phone List (trie树模板题)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26328   Accepted: 7938 Descr ...

  5. HDU 1251 统计难题 (Trie树模板题)

    题目链接:点击打开链接 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单 ...

  6. 利用trie树实现前缀输入提示及trie的python实现

    代码来自https://github.com/wklken/suggestion/blob/master/easymap/suggest.py 还实现了缓存功能,搜索某个前缀超过一定次数时,进行缓存, ...

  7. 835. 字符串统计(Trie树模板题)

    维护一个字符串集合,支持两种操作: “I x”向集合中插入一个字符串x: “Q x”询问一个字符串在集合中出现了多少次. 共有N个操作,输入的字符串总长度不超过 105105,字符串仅包含小写英文字母 ...

  8. hihocoder_1014: Trie树(Trie树模板题)

    题目链接 #include<bits/stdc++.h> using namespace std; ; struct T { int num; T* next[]; T() { num=; ...

  9. hihocoder 1014: Trie树(Trie树模板题)

    题目链接 #include<bits/stdc++.h> using namespace std; ; struct T { int num; T* next[]; T() { num=; ...

随机推荐

  1. JAVA入门教程 - idea 新建maven spring MVC项目

    用的是Idea2017版本.其他大同小异 1.新建项目 2.勾选Create from archetype 选中maven-archetype-webapp 3.输入项目名字. 4.下一步 5.点Fi ...

  2. 跳到IE9的一个坑里了(枚举 JavaScript 属性)

    有一段Json如下 [{"SaleName_ID":"0","SaleName":"","28":& ...

  3. typeahead使用ajax补全输入框的方法

    最近想使用一个输入框补全的功能,bootstrap有,但是官方手册太简单,搞了好几天,终于弄好了. 官方使用的方法是/<input type="text" data-prov ...

  4. 51Nod - 1228 序列求和 (自然数幂和+伯努利数)

    https://vjudge.net/problem/51Nod-1228 Description T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n).给出n和k, ...

  5. Mac Office 2016 破解

    官方最新版本office 是2016.15.38 此版本主要是修复了Excel内存损害漏洞. 官方下载的版本大小是1.67G,因为其他途径下载的版本,不确保是最新版本且为完整的版本.不知道我说的这个大 ...

  6. MVC入门教程

    MVC入门系列教程-视频版本,已入驻51CTO学院,文本+视频学效果更好哦.视频链接地址如下: 点我查看视频.另外,针对该系列教程博主提供有偿技术支持,群号:226090960,群内会针对该教程的问题 ...

  7. APPLE-SA-2019-3-25-2 macOS Mojave 10.14.4,Security Update 2019-002 High Sierra, Security Update 2019-002 Sierra

    APPLE-SA-2019-3-25-2 macOS Mojave 10.14.4, Security Update2019-002 High Sierra, Security Update 2019 ...

  8. ubuntu下objective-c的编译和运行

    ubuntu 下编译objective-c 1.安装编译环境 sudo aptitude install build-essential gobjc gobjc++ gnustep gnustep-d ...

  9. 第26月第25天 ubuntu openjdk-8-jdk jretty

    1.ubuntu ============== sudo apt-get install openjdk-8-jdk https://blog.csdn.net/zhaohaiyitian88/art ...

  10. Viterbi

    把语音分割为计算发音质量测度所需要的小单元时候,需要进行Viterbi对齐 Viterbi,在htk和sphinx中,也被称作token passing model Viterbi解码图是 状态数Sm ...