zoukankan      html  css  js  c++  java
  • Sasha and a Bit of Relax(前缀异或和+二维数组+思维)

    Sasha likes programming. Once, during a very long contest, Sasha decided that he was a bit tired and needed to relax. So he did. But since Sasha isn't an ordinary guy, he prefers to relax unusually. During leisure time Sasha likes to upsolve unsolved problems because upsolving is very useful.

    Therefore, Sasha decided to upsolve the following problem:

    You have an array aa with n integers. You need to count the number of funny pairs (l,r) (l≤r). To check if a pair (l,r)is a funny pair, take mid=(l+r−1)/2, then if r−l+1 is an even number and al⊕al+1⊕…⊕amid=amid+1⊕amid+2⊕…⊕aral⊕al+1⊕…⊕amid=amid+1⊕amid+2⊕…⊕ar, then the pair is funny. In other words, ⊕ of elements of the left half of the subarray from ll to rr should be equal to ⊕⊕ of elements of the right half. Note that ⊕ denotes the bitwise XOR operation.

    It is time to continue solving the contest, so Sasha asked you to solve this task.

    Input

    The first line contains one integer nn (2≤n≤3⋅10^5) — the size of the array.

    The second line contains nn integers a1,a2,…,an (0≤ai<2^20) — array itself.

    Output

    Print one integer — the number of funny pairs. You should consider only pairs where r−l+1r−l+1 is even number.

    Examples

    input

    Copy

    5
    1 2 3 4 5
    

    output

    Copy

    1
    

    input

    Copy

    6
    3 2 2 3 7 6
    

    output

    Copy

    3
    

    input

    Copy

    3
    42 4 2
    

    output

    Copy

    0
    

    Note

    Be as cool as Sasha, upsolve problems!

    In the first example, the only funny pair is (2,5)(2,5), as 2⊕3=4⊕5=12⊕3=4⊕5=1.

    In the second example, funny pairs are (2,3)(2,3), (1,4)(1,4), and (3,6)(3,6).

    In the third example, there are no funny pairs.

    题意:求有多少个异或和相等的偶数区间

    思路:先求出前缀异或和,再用二维数组来进行加的运算,因为后面的可以表示奇数和偶数的而来的,之前的会被总结到,要注意单独一个相邻区间的情况,所以我们把b[0][0]=1

    代码:

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<iostream>
    #include<algorithm>
    #include<stack>
    #include<set>
    #include<vector>
    #include<cmath>
    #define MAX 3000005
    
    
    typedef long long ll;
    
    using namespace std;
    int b[MAX][2];
    int a[MAX];
    ll sum=0;
    int main()
    {
    	int n;
    	cin>>n;
    	b[0][0]=1;
    	for(int t=1;t<=n;t++)
    	{
    		scanf("%d",&a[t]);
    		a[t]^=a[t-1];
    	}
    	for(int t=1;t<=n;t++)
    	{
    		sum+=b[a[t]][t&1];
    	    b[a[t]][t&1]++;
    	}
    	cout<<sum<<endl;
    	return 0;
     } 
  • 相关阅读:
    并不对劲的loj3124:uoj477:p5405:[CTS2019]氪金手游
    并不对劲的loj6498. 「雅礼集训 2018 Day2」农民
    并不对劲的loj2251:p3688[ZJOI2017]树状数组
    并不对劲的loj2050:p3248:[HNOI2016]树
    并不对劲的BJOI2020
    并不对劲的loj3110:p5358:[SDOI2019]快速查询
    并不对劲的loj3111:p5359:[SDOI2019]染色
    (困难) CF 484E Sign on Fence,整体二分+线段树
    算法录 之 拓扑排序和欧拉路径。
    数据结构录 之 BST的高级应用。
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781801.html
Copyright © 2011-2022 走看看