题目

给定一个长度为\(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. 串口通信RXTXcomm使用

    一.串口通信原理 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节. 尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时 ...

  2. centos7.x及centos8.x安装新版docker

    前置步骤 # 如之前安装过docker,请先删除 yum remove docker docker-common docker-selinux docker-engine centos7 # cent ...

  3. vscode自定义运行和调试创建launch.json文件及项目独立配置文件

    1.创建lauch.json文件 2.然后在项目目录中会自动创建.vscode的目录 3.在.vscode目录下创建settings.json项目独立配置文件 4.在settings.json中写入 ...

  4. channel管道

    channel 如果说goroutine是并发体的话,那么channels则是他们之间的通信机制.一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发生值 ...

  5. Python函数每日一讲 - 简洁快速学会globals()函数

    引言 在 Python 中,globals() 函数是一个强大的工具,它允许您访问全局命名空间中的所有变量和函数.本文将深入探讨 globals() 函数的语法.用法以及实际应用场景,帮助大家更好地理 ...

  6. 【Azure 应用服务】Function App / App Service 连接 Blob 报错

    问题描述 因 Blob 启用了防火墙功能,但是当把App Service 或 Function App的出站IP地址都加入到Blob的白名单中,为什么访问还是403错误呢? 问题解答 Azure St ...

  7. 【Azure Redis 缓存】Redis性能指标之Server Load

    Server Load描述 在Redis的官方介绍中,Server Load指标是Redis 服务器忙于处理消息并且非空闲等待消息的周期百分比. 如果此计数器达到 100,则意味着 Redis 服务器 ...

  8. Java 练习题 看起来很简单 写起来却有点难度

    1 import java.io.PrintStream; 2 3 /* 4 * 5 * public class ValueTransferTest4 6 *{ 7 * public static ...

  9. Codeforces Round 924 (Div. 2)B. Equalize(思维+双指针)

    目录 题面 链接 题意 题解 代码 题面 链接 B. Equalize 题意 给一个数组\(a\),然后让你给这个数组加上一个排列,求出现最多的次数 题解 赛时没过不应该. 最开始很容易想到要去重,因 ...

  10. 你想要一个简单的 MQ 吗?(最简单的那种)

    FolkMQ 一个简单的消息中间件(全球最简单的那种,要比谁都简单!).追世间简单为何物,可叫我生死相许! 面向简单编程 1) 启动服务 docker run -p 18602:18602 -p 86 ...