题目大意:
给你一个数k和n个数,再给你m个询问(l,r)问满足l<=i<=j<=r
的(i,j)对有多少,使得 ai,ai+1,......aj 的异或等于k
链接:http://codeforces.com/problemset/problem/617/E
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#include<list>
using namespace std;
typedef long long ll;
const int MAXN=100000+5;
int a[MAXN];
int pre[MAXN];
int cnt[1<<20];
ll result;
ll ans[MAXN];
int unit,n,m,k;
struct Query{
int L,R,id;
}query[MAXN];
bool cmp( Query a,Query b ){
if( a.L/unit==b.L/unit )return a.R<b.R;
return a.L/unit<b.L/unit;
}
void add( int v ){
result+=cnt[ v^k ];
cnt[v]++;
}
void del(int v){
cnt[v]--;
result-=cnt[ v^k ];
}
void work(){
result=0;
int L=1,R=0;
for(int i=0;i<m;i++){
while( R<query[i].R ){
R++;
add(pre[R]);
}
while( R>query[i].R ){
del( pre[R] );
R--;
}
while( L>query[i].L ){
L--;
add(pre[L]);
}
while( L<query[i].L ){
del(pre[L]);
L++;
}
ans[ query[i].id ]=result;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
pre[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
pre[i]=pre[i-1]^a[i];
}
for(int i=0;i<m;i++){
scanf("%d%d",&query[i].L,&query[i].R);
query[i].id=i;
query[i].L--;
}
unit=(int ) sqrt(n);
sort(query,query+m,cmp);
work();
for(int i=0;i<m;i++){
printf("%I64d\n",ans[i]);
}
return 0;
}
219

被折叠的 条评论
为什么被折叠?



