E. Beautiful Subarrays

思路

显然有ai⨁ai+1⨁……⨁an=(a1⨁a2⨁……⨁an)⨁(a1⨁a2⨁……⨁ai−1)a_i\bigoplus a_{i + 1} \bigoplus ……\bigoplus a_{n} = (a_1 \bigoplus a_2 \bigoplus……\bigoplus a_{n}) \bigoplus (a_1 \bigoplus a_2 \bigoplus …… \bigoplus a_{i - 1})ai​⨁ai+1​⨁……⨁an​=(a1​⨁a2​⨁……⨁an​)⨁(a1​⨁a2​⨁……⨁ai−1​)

所以我们可以先求一遍异或前缀和,然后再通过枚举右端点,去查找有多少个左端点符合要求。

假设我们当前枚举到iii这个位置,前iii个数的异或前缀和是aaa,我们要查找异或值大于等于kkk的,显然我们可以去找一个xxx,满足a⨁k=xa \bigoplus k = xa⨁k=x,这个时候大于等于xxx的数就是满足要求的数了,这个操作我们也可以通过一颗01trie01trie01trie树来进行查找。

分四种情况:

  • a 的当前位二进制数是0,k的当前位二进制数也是0,如果我们选择一个数的当前位是1,显然与a异或之后会变大,所以对答案有贡献,所以我们加上答案,然后到当前位上是0的地方去继续寻找。
  • a的当前位二进制数是0, k的当前位二进制数是1,显然我们要使查找值不变小,一定要到当前位是1上去找,这个时候对答案没有哦贡献。
  • a的当前位二进制数是1, k的当前位二进制数是0,如果我们选择1,异或结果变大,对答案有贡献,所以加上答案,走到当前位是1的地方去继续寻找答案。
  • a的当前位二进制数是1, k的当前位二进制也是1,这个时候要保证异或结果不变小,只能到当前位是0的地方去寻找。

最后再特判一下刚好相等的情况就OK了。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}const int N = 4e7 + 10;int trie[N][2], tot, num[N];void insert(int x) {int rt = 0;for(int i = 30; i >= 0; i--) {int now = x >> i & 1;if(!trie[rt][now]) trie[rt][now] = ++tot;rt = trie[rt][now];num[rt]++;}
}int find(int a, int b) {int ans = 0, rt = 0;for(int i = 30; i >= 0; i--) {int u = a >> i & 1, v = b >> i & 1;if(!u) {if(v) {if(!trie[rt][1]) return ans;rt = trie[rt][1];}else {ans += num[trie[rt][1]];if(!trie[rt][0]) return ans;rt = trie[rt][0];}}else {if(!v) {ans += num[trie[rt][0]];if(!trie[rt][1]) return ans;rt = trie[rt][1];}else {if(!trie[rt][0]) return ans;rt = trie[rt][0];}}}return ans + num[rt];
}const int N1 = 1e6 + 10;int a[N1], n, k;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);ll ans = 0;n = read(), k = read();for(int i = 1; i <= n; i++) {a[i] = read();a[i] ^= a[i - 1];}insert(0);//插入0,有可能这个数自己就比k大。for(int i = 1; i <= n; i++) {ans += find(a[i], k);insert(a[i]);}printf("%lld\n", ans);return 0;
}

E. Beautiful Subarrays(思维 01 trie 树)相关推荐

  1. Beautiful Subarrays (01字典树 瞎搞)

    题意: 题解: 一看问的是子序列,并且还是异或. 首先想到01字典树,再一看让你求子序列的个数,大致是想让你把这个序列进行前缀异或处理后然后再01字典树上进行操作吧. 假设01字典树往左边是0右边是1 ...

  2. BZOJ3261 最大异或和 解题报告(可持久化Trie树)

    本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...

  3. codeforces 842 D. Vitya and Strange Lesson(01字典树+思维+贪心)

    题目链接:http://codeforces.com/contest/842/problem/D 题解:像这种求一段异或什么的都可以考虑用字典树而且mex显然可以利用贪心+01字典树,和线段树差不多就 ...

  4. 2021牛客暑期多校训练营4 E-Tree Xor(异或+思维+区间交 or Trie树)

    E-Tree Xor 首先不考虑区间限制条件,我们给定其中一个点的权值后,那么其他点的权值也就确定.比如 val1=0\text{val}_1=0val1​=0,即可通过变得限制求出其他点valu\t ...

  5. P4735 最大异或和 01可持久化Trie树模板

    原题:https://www.luogu.org/problemnew/show/P4735 题解:观察一下式子,将a数组求一个异或前缀和,其实就是s[n]^x^s[p-1]的最大值 p∈[l,r], ...

  6. mysql索引用trie树_数据结构与算法之美【完整版】

    资源目录: ├─01-开篇词 (1讲) │ ├─00丨开篇词丨从今天起,跨过"数据结构与算法"这道坎.html │ ├─00丨开篇词丨从今天起,跨过"数据结构与算法&qu ...

  7. 【CF665E】 Beautiful Subarrays

    题目 展开 题目描述 One day, ZS the Coder wrote down an array of integers aa with elements a_{1},a_{2},-,a_{n ...

  8. cf 665E - Beautiful Subarrays

    One day, ZS the Coder wrote down an array of integers a with elements a1,  a2,  -,  an. A subarray o ...

  9. 从Trie树(字典树)和后缀树

    从Trie树(字典树)谈到后缀树 转载:http://blog.csdn.net/v_july_v/article/details/6897097#t22 感谢作者,侵删. 引言 常关注本blog的读 ...

最新文章

  1. 2022-2028年中国大飞机项目产业链分析及投资咨询报告
  2. Oracle 表空间 创建参数 说明
  3. iOS端实现React Native差异化增量更新
  4. hdu5489 Removed Interval dp+线段树优化
  5. 一个简单的javascript节流器实现
  6. 论文小综 | Neuro-Symbolic Reasoning in NLP
  7. 华为推出业界首个分布式云原生产品:华为云UCS,持续创新,深耕数字化
  8. 求AOE图的 拓扑排序 及关键路径长度(java实现)
  9. mysql 当前时间戳_kettle教程-mysql数据增量抽取-无需时间戳无需标识
  10. eclipse spring mysql_为Eclipse上的Maven project添加SpringMVC和Mybatis以实现数据库
  11. Android学习笔记(六)——CheckBox复选框
  12. mysql 分组统计 取最大值_(Mysql)sql分组取最大值问题
  13. Nginx---- Nginx命令配置到系统环境
  14. 软件测试52讲-安全第一:渗透测试
  15. java案例代码5--编码的方式--密码
  16. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
  17. S3cCTF-gyy-Writeup
  18. 小学计算机片段教学案例,小学信息技术教学案例分析(张擘)
  19. 统计工具代码同步安装和异步安装有何区别
  20. DeepStream初步学习

热门文章

  1. 用柠檬来发电真的可行吗?
  2. 相亲对象能有多油腻......
  3. 他言行不一屡次跳槽,还升职加薪走上了人生巅峰,全数学界都炸了......
  4. 为什么说,每个人都应该多读些书?
  5. 年轻人也太禁不起诱惑了吧?
  6. 孩子不是笨,他和“最强大脑”差的是这个!
  7. 物理学家史蒂夫·霍金逝世,享年76岁(附图文回顾他的一生)
  8. 网页设计的css样式,网页设计引入CSS样式的五种方式_css
  9. php 电梯程序设计,教你写出京东电梯式轮播
  10. mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包