Codeforces 282E Sausage Maximization (Trie)
2016-04-26 14:20
330 查看
题意
给一些数字,求前缀异或和后缀异或的最大值,前缀和后缀不能有交集。思路
枚举每一个后缀,如果用朴素算法就要枚举每一个前缀求最大值。我们可以后缀往后枚举的时候,从之前的前缀里找到异或最大的,然后前缀加一个数的长度之后继续插入。
代码
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; #define LL long long #define Lowbit(x) ((x)&(-x)) #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1|1 #define MP(a, b) make_pair(a, b) const int INF = 0x3f3f3f3f; const int MOD = 1000000007; const int maxn = 1e5 + 10; const double eps = 1e-8; const double PI = acos(-1.0); typedef pair<int, int> pii; struct Trie { int next[2]; Trie() {next[0] = next[1] = 0;} }trie[64*maxn]; LL a[maxn]; LL tot; void insert(LL s) { int step = 0; for (int i = 63; i >= 0; i--) { int num = (((1LL << i) & s) != 0); if (!trie[step].next[num]) trie[step].next[num] = ++tot; step = trie[step].next[num]; } } LL query(LL s) { LL res = 0; int step = 0; for (int i = 63; i >= 0; i--) { int num = (((1LL << i) & s) == 0); if (!trie[step].next[num]) num ^= 1; res = res * 2LL + (LL)num; step = trie[step].next[num]; } return res; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n; while (scanf("%d", &n) != EOF) { LL post = 0, pre = 0; for (int i = 0; i < n; i++) scanf("%lld", &a[i]), post ^= a[i]; insert(0LL); LL ans = post; for (int i = 0; i < n; i++) { pre ^= a[i], post ^= a[i]; insert(pre); LL t = query(post); ans = max(ans, t ^ post); } printf("%lld\n", ans); } return 0; }
相关文章推荐
- sql入门
- ganglia对于tomcat进程的res内存监控扩展
- jQuery中$.fn的用法示例介绍
- 各种排序算法
- HTTP: Status code
- [并发并行]_[Windows]_[指定程序执行的CPU]
- 欢迎使用CSDN-markdown编辑器
- 生成伪随机数
- [并发并行]_[Windows]_[指定程序执行的CPU]
- ceilometer + gnocchi + aodh集成(002) ---- M版本openstack环境安装
- jQuery常用方法2
- Excel操作之 导出生成多个sheet页面
- 支付宝集成获取私钥与公钥
- 五种排序的思想及其基本实现
- Android笔记:Activity的生命周期以及启动模式
- 人生如梦
- Java IO:BufferedInputStream使用详解及源码分析
- 在Linux中使用unzip打开zip文件失败
- 常见的各个平台下面的内存检查工具或者插件
- 矩阵、向量求导法则