#10051 Nikitosh 和异或
时间:2020-04-10
本文章向大家介绍#10051 Nikitosh 和异或,主要包括#10051 Nikitosh 和异或使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
其实题意已经简单的不能再简单了,所以就不讲了。
因为题目中 \(1\leq l_1 \leq r_1 <l_2 \leq r_2\leq N\),所以显然对于最终答案,总有一个 \(x\) 满足 \(r_1\leq x<l_2\)。
那么就可以不断尝试以那个点为 \(x\),来求出答案,具体方法如下:
设 \(l_i=max_{1\leq l \leq r\leq i}\{a_l\bigoplus a_{l+1}\bigoplus..\bigoplus a_r\}\),\(r_i=max_{i\leq l\leq r\leq N}\{a_l\bigoplus a_{l+1}\bigoplus..\bigoplus a_r\}\)。
那么 \(ans=max_{1\leq i<N}\{l_i+r_{i+1}\}\),而关键在于怎么求 \(l_i,r_i\)。
这里引入一个概念:异或前缀和,即 \(S_i=a_0\bigoplus a_1\bigoplus a_2\bigoplus...\bigoplus a_i\)。(其中 \(a_0=0\))
那么 \(l_i=max_{1\leq j< i}\{S_i\bigoplus S_j\}\),\(r_i=max_{i< j\leq N}\{S'_i\bigoplus S'_j\}\)。(其中 \(S'_i=a_N\bigoplus a_{N-1}\bigoplus...\bigoplus a_i\))
然后就是简单的 trie 贪心求最大异或对了,但是还有几处细节要注意,都写在代码里了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define N 9000010
using namespace std;
int n, trie[N][2], l[N], r[N], a[N], tot = 0;
int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') f = (c == '-') ? -1 : 1, c = getchar();
while (c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
void insert(int x) {
int p = 0;
for (int i = 31; i >= 0; i--) {
int ch = (x >> i) & 1;
if (!trie[p][ch])
trie[p][ch] = ++tot;
p = trie[p][ch];
}
return;
}//简单的模板式的插入。
int search(int x) {
int p = 0, ans = 0;
for (int i = 31; i >= 0; i--) {
int ch = (x >> i) & 1;
if (trie[p][ch ^ 1]) {
ans |= (1 << i);
p = trie[p][ch ^ 1];
} else
p = trie[p][ch];
}
return ans;
}
//简单的模板式的查询。
int main() {
n = read();
int s = 0;
insert(s);
for (int i = 1; i <= n; i++) {
a[i] = read();
s ^= a[i];//当前的异或前缀和。
insert(s);
l[i] = max(l[i - 1], search(s));//一定要取 max。
}
memset(trie, 0, sizeof(trie));
tot = 0;//记得清零。
insert(s);
for (int i = n; i >= 1; i--) {
s ^= a[i];
insert(s);
r[i] = max(r[i + 1], search(s));//同上。
}
int ans = 0;
for (int i = 1; i < n; i++) ans = max(ans, l[i] + r[i + 1]);
printf("%d\n", ans);
return 0;
}
原文地址:https://www.cnblogs.com/lpf-666/p/12674508.html
- 实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
- Android中Context用法详解学习
- 【自然框架】之 “表单控件”与“实体类”
- Android数据存储实现的5大方式
- Android实现图片异步加载操作
- (PDF.NET框架实例讲解)将存储过程映射为实体类
- 【开源】QuickPager ASP.NET2.0分页控件——使用示例、基本应用和查询功能
- 移花接木:当泛型方法遇上抽象类----我的“内存数据库”诞生记
- Android扫描多媒体文件剖析
- Android的进程与线程使用总结
- Android在WebView中加载HTML并实现交互
- 使用ASP.NET MVC2+PDF.NET 构建一个简单的新闻管理程序 示例过程
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.3 【增加了使用说明】
- Android中Java和JavaScript交互
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基础知识 | R语言数据分析之控制流
- 基础知识 | R语言数据处理之日期值的转换
- 云开发 CloudBase CMS 内容管理系统正式开源啦!
- 高维数据 | R语言数据可视化之热力图
- 高维数据 | R语言数据可视化之日历图
- 打卡群刷题总结0804——二叉树的中序遍历
- 基础知识 | R语言数据管理之SQL语句
- 文本挖掘| 某作者文章的词频统计排序
- spring注解配置之@Configuration
- TS核心知识点总结及项目实战案例分析
- 用Python开发 写个消消乐小游戏
- 原理+代码|Python实战多元线性回归模型
- nestjs+vue+ts打造一个酷炫的星空聊天室(含完整数据库设计)
- JUnit 5基础指南
- 记录一则expdp任务异常处理案例