Codeforces 282E Sausage Maximization(字典树)
2016-01-16 18:47
274 查看
题目链接:282E Sausage Maximization
题目大意:给定一个序列A。要求从中选取一个前缀,一个后缀,能够为空,当时不能重叠。亦或和最大。
解题思路:预处理出前缀后缀亦或和,然后在字典树中维护。每次加入并查询。过程中维护ans。
题目大意:给定一个序列A。要求从中选取一个前缀,一个后缀,能够为空,当时不能重叠。亦或和最大。
解题思路:预处理出前缀后缀亦或和,然后在字典树中维护。每次加入并查询。过程中维护ans。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 1e5 + 5; struct Tire { int sz, g[maxn * 100][2]; void init(); void insert(ll s); ll find(ll s); }T; int N; ll A[maxn], prefix[maxn], suffix[maxn]; int main () { scanf("%d", &N); for (int i = 1; i <= N; i++) scanf("%lld", &A[i]); for (int i = 1; i <= N; i++) prefix[i] = prefix[i-1] ^ A[i]; for (int i = N; i; i--) suffix[i] = suffix[i+1] ^ A[i]; ll ans = 0; T.init(); for (int i = N; i >= 0; i--) { T.insert(suffix[i+1]); ans = max(ans, T.find(prefix[i])); } printf("%lld\n", ans); return 0; } void Tire::init() { sz = 1; memset(g[0], 0, sizeof(g[0])); } void Tire::insert(ll s) { int u = 0; for (int i = 60; i >= 0; i--) { int v = (s>>i)&1; if (g[u][v] == 0) { memset(g[sz], 0, sizeof(g[sz])); g[u][v] = sz++; } u = g[u][v]; } } ll Tire::find (ll s) { int u = 0; ll ret = 0; for (int i = 60; i >= 0; i--) { int v = ((s>>i)&1) ^ 1; if (g[u][v]) ret |= (1LL<<i); else v = v ^ 1; u = g[u][v]; } return ret; }
相关文章推荐
- RMI与Hession使用
- virtual memory exhausted: Cannot allocate memory 解决方法
- 关于判断oracle中变量为空和空字符串
- eval获取使用字符串同名变量
- 你在发表理科学术文章过程中有哪些经验值得借鉴
- Sicily 3836. 计算组合数
- 云计算aws系列:scp上传下载文件
- DNS基本工作原理及正反向解析和主从同步等操作说明
- bzoj2338 数矩形
- POJ1860(Currency Exchange)(Bellman-Ford)
- 大北农董事长夫人莫云为何在美国被逮捕?
- 更新Windows ActiveX,Ios
- iOS--错误集锦--****is missing a [super ViewDidLoad]call
- 283. Move Zeroes
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法
- [SETUP] .NET 5 with Linux
- CVonline: Image Databases(CVonline)视觉/图像数据集大列表
- Codeforces Gym 100015F Fighting for Triangles 状压DP
- 8086处理器的无条件转移指令——《x86汇编语言:从实模式到保护模式》读书笔记13
- 如何总结和整理学术文献