期望得分:100+100+40=240
实际得分:100+100+20=220
T1
sum[r]^sum[l-1]<k
对前缀异或和建trie树
假设当前是第i位,sum[r]的地i位是l
如果k的第i位为1,累加l,当前指针转到sum[r]的l^1
否则,当前指针直接转到sum[r]的l
#include<cstdio> #include<iostream> using namespace std; typedef long long LL; #define N 100001 int bit[31]; int tr[N*30][2],sum[N*30]; int k; int tot=1,root=1; LL ans; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } void insert(int x) { int now=root; bool j; for(int i=30;i>=0;--i) { j=x&bit[i]; if(!tr[now][j]) tr[now][j]=++tot; now=tr[now][j]; sum[now]++; } } void query(int x) { int now=root; bool l,r; for(int i=30;i>=0;--i) { if(!now) return; l=x&bit[i]; r=l^1; if(k&bit[i]) { ans+=sum[tr[now][l]]; now=tr[now][r]; } else now=tr[now][l]; } } int main() { freopen("bit.in","r",stdin); freopen("bit.out","w",stdout); bit[0]=1; for(int i=1;i<=30;++i) bit[i]=bit[i-1]<<1; int n,x; read(n); read(k); insert(0); int pre=0; for(int i=1;i<=n;++i) { read(x); pre^=x; query(pre); insert(pre); } cout<<ans; }