• 异或序列


    6759: 异或序列

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 191  解决: 88
    [提交] [状态] [讨论版] [命题人:admin]

    题目描述

    已知一个长度为n的整数数列a1,a2,…,an,给定查询参数l、r,问在al,al+1,…,ar区间内,有多少子序列满足异或和等于k。也就是说,对于所有的x,y(l≤x≤y≤r),满足ax⊕ax+1⊕⋯⊕ay=k的x,y有多少组。

    输入

    输入第一行为3个整数n,m,k。第二行为空格分开的n个整数,即a1,a2,…,an。接下来m行,每行两个整数lj,rj,代表一次查询。

    输出

    输出共m行,对应每个查询的计算结果。

    样例输入

    4 5 1
    1 2 3 1
    1 4
    1 3
    2 3
    2 4
    4 4
    

    样例输出

    4
    2
    1
    2
    1
    

    提示

    对于30%的数据,1≤n,m≤1000。
    对于100%的数据,1≤n,m≤105,0≤k,ai≤105,1≤lj≤rj≤n。

    来源/分类

    思路:不知道是不是莫队都要  l=1,r=0   来初始化!
    AC代码:
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define N 1000010
    struct data
    {
        int l,r,id,block;
    } q[N];
    int n,m,k;
    ll ans;
    ll sum[N],cnt[N],a[N],answer[N];
    bool cp(data x,data y)
    {
        if(x.block!=y.block) return x.block<y.block;
        return x.r<y.r;
    }
    void solve()
    {
        sort(q+1,q+m+1,cp);
        int l=1,r=0;
        for(int i=1; i<=m; i++)
        {
            while(l<q[i].l-1)
            {
                cnt[sum[l]]--;
                ans-=cnt[k^sum[l]];
                l++;
            }
            while(l>q[i].l-1)
            {
                l--;
                ans+=cnt[k^sum[l]];
                cnt[sum[l]]++;
            }
            while(r<q[i].r)
            {
                r++;
                ans+=cnt[k^sum[r]];
                cnt[sum[r]]++;
            }
            while(r>q[i].r)
            {
                cnt[sum[r]]--;
                ans-=cnt[k^sum[r]];
                r--;
            }
            answer[q[i].id]=ans;
        }
        for(int i=1; i<=m; i++) printf("%lld
    ",answer[i]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1; i<=n; i++) scanf("%lld",&a[i]);
        int siz=(int)(sqrt(n));
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d",&q[i].l,&q[i].r);
            q[i].id=i;
            q[i].block=(q[i].l-1)/siz;
        }
        sum[1]=a[1];
        for(int i=2; i<=n; i++) sum[i]=a[i]^sum[i-1];
        solve();
        return 0;
    }
    View Code
      
  • 相关阅读:
    细说java平台日志组件
    linux远程执行命令
    linux命令 common 文件比较
    Linux Shell脚本编程--cut命令
    linux sort命令
    shell中if判断一个变量为空
    linux shell if参数
    wc命令
    date 命令
    let 与 expr Shell运算比较 let强强胜出
  • 原文地址:https://www.cnblogs.com/lglh/p/9444599.html
Copyright © 2020-2023  润新知