codeforce 617E XOR and Favorite Number 莫队算法

题目大意:

给你一个数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;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值