题目

给定一个长度为\(n\)的序列,询问有多少个\((l,r),1\leq l\leq r\leq n\)满足

\[xor_{l\leq j\leq r}a_j\geq k
\]

分析

显然跑一次前缀和就变成查询两个数的异或值是否不少于\(k\)

那么这显然可以转换成01trie的问题

按照二进制位处理,分类讨论:

  1. 当前\(x\)和\(k\)的二进制位为1,那么跳到\(trie[p][0]\)
  2. 当前\(x\)和\(k\)的二进制位为0,那么只要让该二进制位为1就能使异或值大于\(k\),然后累计答案再跳到\(trie[p][0]\)
  3. 当前\(x\)的二进制位为0,\(k\)的二进制位为1,那么跳到\(trie[p][1]\)
  4. 当前\(x\)的二进制位为1,\(k\)的二进制位为0,那么只要让该二进制位为0就能使异或值大于\(k\),然后累计答案再跳到\(trie[p][1]\)

代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=1000011;
int a[N],n,m; long long ans;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
struct Trie{
int trie[N*30][2],cnt[N*30],tot;
inline void Clear(){
trie[1][0]=trie[1][1]=cnt[1]=0,tot=1;
}
inline void Insert(int x){
rr int p=1;
for (rr int i=29;~i;--i){
rr int z=(x>>i)&1;
if (!trie[p][z]){
trie[p][z]=++tot,cnt[tot]=0,
trie[tot][0]=trie[tot][1]=0;
}
++cnt[p],p=trie[p][z];
}
++cnt[p];
}
inline signed query(int x){
rr int p=1,ans=0;
for (rr int i=29;~i;--i){
if (!p) return ans;
if ((x>>i)&1){
if ((m>>i)&1) p=trie[p][0];
else ans+=cnt[trie[p][0]],p=trie[p][1];
}else{
if ((m>>i)&1) p=trie[p][1];
else ans+=cnt[trie[p][1]],p=trie[p][0];
}
}
return ans+cnt[p];
}
}trie;
signed main(){
freopen("xor.in","r",stdin);
freopen("xor.out","w",stdout);
for (rr int T=iut();T;--T){
trie.Clear(),trie.Insert(0),
n=iut(),m=iut(),ans=0;
for (rr int i=1,x=0;i<=n;++i){
x^=iut(),
ans+=trie.query(x),
trie.Insert(x);
}
printf("%lld\n",ans);
}
return 0;
}

#trie#A 区间异或的更多相关文章

  1. Consecutive Sum LightOJ - 1269(区间异或和)

    Consecutive Sum 又来水一发blog... 本来是昨天补codechef的题,最后一道题是可持久化字典树,然后去黄学长博客看了看 觉得字典树写法有点不太一样,就想着用黄学长的板子写码几道 ...

  2. BZOJ 4260 Codechef REBXOR (区间异或和最值) (01字典树+DP)

    <题目链接> 题目大意:给定一个序列,现在求出两段不相交的区间异或和的最大值. 解题分析: 区间异或问题首先想到01字典树.利用前缀.后缀建树,并且利用异或的性质,相同的两个数异或变成0, ...

  3. BZOJ 4260: Codechef REBXOR (trie树维护异或最大值)

    题意 分析 将区间异或和转化为前缀异或和.那么[L,R][L,R][L,R]的异或和就等于presum[R] xor presum[L−1]presum[R]\ xor \ presum[L-1]pr ...

  4. CF 617E【莫队求区间异或和】

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  5. P3943 星空 区间异或差分

    \(\color{#0066ff}{ 题目描述 }\) 逃不掉的那一天还是来了,小 F 看着夜空发呆. 天上空荡荡的,没有一颗星星--大概是因为天上吹不散的乌云吧. 心里吹不散的乌云,就让它在那里吧, ...

  6. bzoj 2819 Nim dfn序+树状数组维护区间异或值

    题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  7. 计蒜客 39272.Tree-树链剖分(点权)+带修改区间异或和 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest E.) 2019ICPC西安邀请赛现场赛重现赛

    Tree Ming and Hong are playing a simple game called nim game. They have nn piles of stones numbered  ...

  8. BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )

    题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = ...

  9. 51Nod - 1295:XOR key (可持久化Trie求区间最大异或)

    给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求ALL 至 ARR 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值 ...

  10. Educational Codeforces Round 12 E. Beautiful Subarrays trie求两异或值大于等于k对数

    E. Beautiful Subarrays   One day, ZS the Coder wrote down an array of integers a with elements a1,   ...

随机推荐

  1. 解决Linux平台Selenium截图中文乱码问题

    通常情况下,像CentOS这样的Linux发行版默认是缺少中文字体的,所以在执行Selenium截图时,如果目标网页中有中文,则截图后中文将会显示为方块一样的乱码. 解决办法:手动安装中文字体即可. ...

  2. 【LeetCode二叉树#01】二叉树的遍历(递归/迭代)

    二叉树递归遍历 写递归算法时候需要遵循的三个点: 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函 ...

  3. 【Azure 事件中心】通过 az rest --method get 如何获得Event Hub Entity 级的统计指标

    问题描述 通过 az rest --method get  如何获得Event Hub Entity 级的统计指标? 问题解答 查阅文档  https://learn.microsoft.com/en ...

  4. ElasticSearch基本查询使用(2)

    在介绍本章之前,需要先打开安装的Kibana页面, 并打开命令行工具页面: 并且根据上节的介绍,我们需要根据中文搜索,所以需要在建立映射时,指定中文字段的分词器为Ik分词器, 默认为英文分词器,每个中 ...

  5. Visual Studio部署C++环境下OpenCV库

      本文介绍在Visual Studio 2022中配置.编译C++计算机视觉库OpenCV的方法. 1 OpenCV库配置   首先,我们进行OpenCV库的下载与安装.作为一个开源的库,我们直接在 ...

  6. 关于Chrome版本太旧的更新问题

    •问题 这两天不知道咋了,Chrome 老是给我提示版本太旧,需要更新. 作为一名资深的强迫症患者,这让我很是不爽. •解决方案 在桌面找到 Chrome 图标,右击选择[属性],在该位置添加如下语句 ...

  7. git reset --soft HEAD^^ 项目提交代码冲突 提交当前merge后,别提交远程,用命令回滚2次,到未提交的版本,再拉取同事代码,冲突解决

    git reset --soft HEAD^^ 项目提交代码冲突 提交当前merge后,别提交远程,用命令回滚2次,到未提交的版本,再拉取同事代码,冲突解决 当多人写一个项目,最好还是关掉vscode ...

  8. 阿里云Python UDP Server和client基础教程

    壹: socket通信是常用的一种通信方式,熟练掌握,快速的入戏,是一个程序员必备的素质. 贰: 注意:udp和tcp的套接字: 服务端代码: #!/usr/bin/env python3 # -*- ...

  9. Android 设置任意View的背景为圆形或圆角

    原文地址: Android 设置任意View的背景为圆形或圆角 - Stars-One的杂货小窝 我的需求主要还是在SurfaceView需要设置为圆形背景,在网上找了下,发现一个可行方法,做个记录 ...

  10. GdbServer和libuuid移植到HISI3520d

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...