MORE XOR

Given a sequence of nnn numbers a1,a2,⋯ ,ana_1, a_2, \cdots, a_na1​,a2​,⋯,an​ and three functions.Define a function f(l,r)f(l,r)f(l,r) which returns ⊕a[x]\oplus a[x]⊕a[x] (l≤x≤rl \le x \le rl≤x≤r). The ⊕\oplus⊕ represents exclusive OR.Define a function g(l,r)g(l,r)g(l,r) which returns ⊕f(x,y)(l≤x≤y≤r)\oplus f(x,y)(l \le x \le y \le r)⊕f(x,y)(l≤x≤y≤r).Define a function w(l,r)w(l,r)w(l,r) which returns ⊕g(x,y)(l≤x≤y≤r)\oplus g(x,y)(l \le x \le y \le r)⊕g(x,y)(l≤x≤y≤r).You are also given a number of xor-queries. A xor-query is a pair (i,ji, ji,j) (1≤i≤j≤n1 \le i \le j \le n1≤i≤j≤n). For each xor-query (i,j)(i, j)(i,j), you have to answer the result of function w(l,r)w(l,r)w(l,r).InputLine 111: t(1≤t≤20)t (1 \le t \le 20)t(1≤t≤20).For each test case:Line 111: n(1≤n≤100000)n (1 \le n \le 100000)n(1≤n≤100000).Line 222: nnn numbers a1,a2,⋯ ,an(1≤ai≤109)a_1, a_2, \cdots, a_n (1 \le a_i \le 10^9)a1​,a2​,⋯,an​(1≤ai​≤109).Line 333: q(1≤q≤100000)q (1 \le q \le 100000)q(1≤q≤100000), the number of xor-queries.In the next qqq lines, each line contains 222 numbers i,ji, ji,j representing a xor-query (1≤i≤j≤n)(1 \le i \le j \le n)(1≤i≤j≤n).It is guaranteed that sum of nnn and q≤106q \le 10^6q≤106.OutputFor each xor-query (i,j)(i, j)(i,j), print the result of function w(i,j)w(i,j)w(i,j) in a single line
样例输入
5
1 2 3 4 5
5
1 3
1 5
1 4
4 5
3 5
样例输出
4
0
1
4
g(i,j):当区间长度为偶数时为零,为奇数时是区间中第1,3,5,7,9,,,,奇数位数的数的异或和
w(i,j):区间长度为len=j-i+1
若len%4=0 值为0
若len%4=1 值为区间中4k+1位数的数的异或和
若len%4=2 值为区间中4k+1和4k+2位数的数的异或和
若len%4=3 值为区间中4k+3位数的数的异或和

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+20;
int a[N],b[N];
int main()
{
    int t,n,m,i,j,q,l,r,sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        memset(b,0,sizeof(b));
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(i=1;i<=n;i++)
        {
            if(i<=4)
                b[i]=a[i];
            else
                b[i]=a[i]^b[i-4];
        }
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d%d",&l,&r);
            m=r-l+1;
            if(m%4==0)
            {
                cout<<"0"<<'\n';
                continue;
            }
            else if(m%4==1)
            {
                sum=b[r];
                if(l-4>=0)
                    sum^=b[l-4];
                cout<<sum<<'\n';
            }
            else if(m%4==3)
            {
                sum=b[r-1];
                if(l-3>=0)
                    sum^=b[l-3];
                cout<<sum<<'\n';
            }
            else
            {
                sum=b[r]^b[r-1];
                if(l-4>=0)
                    sum^=b[l-4];
                if(l-3>=0)
                    sum^=b[l-3];
                cout<<sum<<'\n';
            }
        }
    }
    return 0;
}

全部评论

相关推荐

斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务