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

假设01字典树往左边是0右边是1
对于如何寻找k这个值,肯定是顺着k这个值对应的链下去,那么对于这条链右边的链来说,值都是大于k的。那么我们在递归k的时候,对于右边的链直接把他们的个数给加上即可。这题比较难处理的是对于异或前缀的一个转换。

特别注意叶子节点需要特判一下。

大佬的代码:

#include<bits/stdc++.h>
//#define int long long
using namespace std;
#define ll long long
const int maxn = 1e6+10+1;int trie[maxn*32][2];
ll cnt[maxn*32];
int tot=1;  //从一开始是因为node起点为1,node从1开始是防止node=0的干扰
void ins(int x){int node=1;for(int i=31;i>=0;i--){int t=(x>>i)&1;if(!trie[node][t]){trie[node][t]=++tot;}node=trie[node][t];cnt[node]++;}
}
ll query(int x,int k){int node=1;ll res=0;for(int i=31;i>=0;i--){int now=(x>>i)&1;int t=(k>>i)&1;if(t==1) node=trie[node][!now];else{res+=cnt[trie[node][!now]];node=trie[node][now];}}res+=cnt[node];return res;
}signed main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int n,k;cin>>n>>k;int pre=0;ll ans=0;ins(0);for(int i=1;i<=n;i++){int x;cin>>x;pre^=x;ans+=query(pre,k);ins(pre);}cout<<ans<<endl;
}

我的沙口代码:

#include<bits/stdc++.h>
//#define int long long
using namespace std;
#define ll long long
const int maxn = 1e6+10+1;int trie[maxn*32][2];
ll cnt[maxn*32];
int tot;
void ins(int x){int node=0;for(int i=31;i>=0;i--){int t=(x>>i)&1;if(!trie[node][t]){trie[node][t]=++tot;}node=trie[node][t];cnt[node]++;}
}
ll query(int x,int k){int node=0;ll res=0;for(int i=31;i>=0;i--){int now=(x>>i)&1;int t=(k>>i)&1;//cout<<"pre  now "<<i<<" "<<now<<" "<<t<<endl;  //末尾结点的处理if(i==0){if(now==1) res+=cnt[trie[node][t^1]];else res+=cnt[trie[node][t]];//break;}if(now==1&&t==0){if(trie[node][t]) res+=cnt[trie[node][t]];if(trie[node][1]) node=trie[node][1];else break;}if(now==1&&t==1){if(trie[node][0]) node=trie[node][0];else break;}if(now==0&&t==0){if(trie[node][1]) res+=cnt[trie[node][1]];if(trie[node][t]) node=trie[node][t];else break;}if(now==0&&t==1){if(trie[node][t]) node=trie[node][t];else break;}}return res;
}signed main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int n,k;cin>>n>>k;int pre=0;ll ans=0;ins(0);for(int i=1;i<=n;i++){int x;cin>>x;//if(x>=k) ans++;pre^=x;//cout<<"debug  "<<pre<<endl;ans+=query(pre,k);ins(pre);//cout<<"debug  "<<ans<<endl;}cout<<ans<<endl;
}

Beautiful Subarrays (01字典树 瞎搞)相关推荐

  1. zcmu-1783(01字典树)

    1783: 秋实大哥与快餐店 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 78  Solved: 12 [Submit][Status][Web B ...

  2. hdu5296 01字典树

    根据二进制建一棵01字典树,每个节点的答案等于左节点0的个数 * 右节点1的个数 * 2,遍历整棵树就能得到答案. AC代码: #include<cstdio> using namespa ...

  3. 奶牛异或(01字典树)

    题意: 让你找一个连续区间异或和最大,如果有相同的,则输出断点较小的. 题解: 01字典树,利用前缀和的思想进行求解,我们在插入前缀的同时,也在不断的更新最大值. 我们查询当前 二进制字符串与已经插入 ...

  4. hdu-4825(01字典树)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  5. HDU4825 Xor Sum 01字典树(Tire Tree)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

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

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

  7. 字典树-01字典树基础

    字典树-01字典树 什么是字典树? 字典树,又叫前缀树,Trie树,通常被用作字符串匹配. 它的实现原理是什么? 先建立一颗树,对于这棵树上每个节点i与其后继节点间的连线,都有存入一个字符. 对于存图 ...

  8. Codechef REBXOR HYSBZ - 4260(01字典树+区间异或最大)

    Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,-,AN. Output 输出一行包含给定表达式可能的最大值. Sample Input 5 1 2 ...

  9. 【CodeForces - 706D】Vasiliy's Multiset(01字典树)

    题干: Author has gone out of the stories about Vasiliy, so here is just a formal task description. You ...

最新文章

  1. 《云计算:概念、技术与架构》一2.3 案例研究3:Innovartus
  2. K8S Runtime CRI OCI contained dockershim 理解(转)
  3. java json设置编码_我们如何用Java编码JSON对象?
  4. python中自带的三个装饰器
  5. android读取外部图片,Android读取本地图库与调用摄像头拍摄
  6. jmeter所有版本下载地址分享
  7. 【python数据挖掘课程】十二.Pandas、Matplotlib结合SQL语句对比图分析
  8. HTML <cite> 标签
  9. C# 将List中的数据导入csv文件中
  10. [蛋蛋の插画日记]囧...居然漏了一期《可爱100》!
  11. 浮点数赋值给整数_初学者专题:变量和赋值
  12. SQL9 查找除复旦大学的用户信息(数据库否定语句写法)
  13. 主板后置音频接口图解_颜值出众、用料靠谱——华擎(ASRock)Z490 Extreme4极限玩家主板 简析...
  14. Matlab怎样将传递函数转换成差分方程
  15. html是非结构数据吗,Python处理非结构数据
  16. 配置ANDROID开发环境的方法
  17. keydown - keypress - keyup 用法和区别
  18. 批处理获取网卡名称(附修改IP、网关、DNS脚本)
  19. Axure RP8介绍
  20. reg类型变量综合电路_基本门电路逻辑符号.doc

热门文章

  1. 解决kalilinux: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/
  2. 硬肝!超详细matplotlib基础介绍!!!
  3. 【号外】来人鸭~ 本公众号纳新啦~
  4. 服务器性能估算参考(硬件-分析数据库)
  5. 高精度地图量产难,四维图新利用优势准备实现突破
  6. CentOS之——CentOS7安装iptables防火墙
  7. 转:MySQL 开发实践 8 问,你能 hold 住几个?
  8. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)
  9. Action Golf 四个魔法球实战训练系列_huatuo_新浪博客
  10. UI基础 - UIScrollView