codeforce617 E. XOR and Favorite Number 异或 莫队

本文介绍了一种求解区间内连续区间异或运算等于特定值K的区间对数的算法。通过预处理异或前缀和,使用计数数组记录各区间值出现次数,实现高效查找。该算法适用于处理大量查询,特别在数据结构和算法竞赛中常见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

E. XOR and Favorite Number

求区间内连续区间异或运算为K的区间对数

预处理异或前缀 当 b[r]^K=b[l-1]时区间r~l的值为K

cnt[i]记录 所在区间内值为i的个数 若i^K=l/r 则相应加减 , 其中l的值为给定的l -1 因为在区间l~r内 b[r]对答案没有贡献

#include<bits/stdc++.h>
using namespace std;
const int MAX=3e6+5;
int n,m,K,a[MAX],b[MAX],cnt[MAX],block;
struct Q
{
    int l,r,id;
    long long ans;
}q[MAX];
bool cmp1(Q a,Q b)
{
    return a.l/block==b.l/block?a.r<b.r:a.l/block<b.l/block;
}
bool cmp2(Q a,Q b)
{
    return a.id<b.id;
}
int main()
{
    while(~scanf("%d%d%d",&n,&m,&K))
    {
        b[0]=0;memset(cnt,0,sizeof(cnt));a[0]=0;
        for(int i=1;i<=n;++i) {scanf("%d",&a[i]);b[i]=b[i-1]^a[i];}
        for(int i=0;i<m;++i) {scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;--q[i].l;}
        block=sqrt(n);
        sort(q,q+m,cmp1);
        int L=q[0].l,R=q[0].l-1;long long ans=0;
        for(int i=0;i<m;++i)
        {
            while(R<q[i].r) {++R;ans+=cnt[b[R]^K];++cnt[b[R]];}
            while(R>q[i].r) {--cnt[b[R]];ans-=cnt[b[R]^K];--R;}
            while(L>q[i].l) {--L;ans+=cnt[b[L]^K];++cnt[b[L]];}
            while(L<q[i].l) {--cnt[b[L]];ans-=cnt[b[L]^K];++L;}
            q[i].ans=ans;
        }
        sort(q,q+m,cmp2);
        for(int i=0;i<m;++i) printf("%lld\n",q[i].ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值