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;
}

Sasha and a Bit of Relax(前缀异或和+二维数组+思维)的更多相关文章

  1. Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax(前缀异或和)

    转载自:https://blog.csdn.net/Charles_Zaqdt/article/details/87522917 题目链接:https://codeforces.com/contest ...

  2. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  3. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  4. AcWing 前缀和 一维加二维

    一维 #include<bits/stdc++.h> using namespace std; ; int n,m; int a[N],s[N]; int main(){ ios::syn ...

  5. 洛谷 P2733 家的范围 Home on the Range Label:二维数组前缀和

    题目背景 农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛.(因为一些原因,他的奶牛只在正方形的牧场上吃草.)遗憾的是,他的奶牛已经毁坏一些土地.( 一 ...

  6. P2280 [HNOI2003]激光炸弹(二维前缀和)

    题目描述 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(n≤10000)个目标,用整数xi,yi(0≤xi,yi≤5000)表示目标在地图上的位置,每个目标都有一个价 ...

  7. HDU - 6336 Problem E. Matrix from Arrays (规律+二维前缀和)

    题意: for (int i = 0; ; ++i) { for (int j = 0; j <= i; ++j) { M[j][i - j] = A[cursor]; cursor = (cu ...

  8. hdu6514 一维化 + 二维前缀和

    http://acm.hdu.edu.cn/showproblem.php?pid=6514 题意 给出一个大矩形(\(nm\leq10^7\)),有p个矩形覆盖,然后有q次询问,询问指定矩形内是否覆 ...

  9. 前缀和&二维前缀和

    我们知道,数组上的前缀和S[i]=S[i-1]+a[i] 那么,怎样求二维前缀和呢? 二维前缀和: 绿色点的前缀和就是黄色.红色.灰色和绿色的点权和 怎样计算? s[i][j]=s[i-1][j]+s ...

随机推荐

  1. android:gravity设置居中的问题

    如果设置一个Button的android:gravity="center" android:text="按钮",则是设置了“按钮”两个字在Button中居中显示 ...

  2. 409. Longest Palindrome 最长对称串

    [抄题]: Given a string which consists of lowercase or uppercase letters, find the length of the longes ...

  3. Linux查看操作系统版本的几种方式

    Linux查看操作系统版本的几种方式: 1.uname -a 2.lsb_release -a 3.cat /etc/issue 4.cat /proc/version 5.cat /etc/redh ...

  4. golang学习

    1. 学习资源列表 https://github.com/golang/go/wiki 2. 最快的入门方法 直接通过代码学习 https://tour.go-zh.org 3. go指南 https ...

  5. tensorflow 中 feed的用法

    Feed 上述示例在计算图中引入了 tensor, 以常量或变量的形式存储. TensorFlow 还提供了 feed 机制, 该机制 可以临时替代图中的任意操作中的 tensor 可以对图中任何操作 ...

  6. Luogu 4254 [JSOI2008]Blue Mary开公司

    BZOJ 1568 学习了一波李超线段树. 大佬blog 这个东西专门用来维护插入一条线段和区间/单点的最大/最小值. 插入的时候讨论: 1.如果当前结点上没有线段,那么直接插入. 2.如果当前结点上 ...

  7. ESP8266-iot-3

    ESP8266 WIFI操作 参考资料 模式选择 程序: 把之前的Helloworld程序复制过来改成wifi工程 先输出获取的当前模式 编译后会出错,因为os_printf的头文件没有被包含进来 结 ...

  8. ParameterizedType的作用

    public interface ParameterizedType  extends Type subParam.Java package com.example.test; public clas ...

  9. do_gettimeofday使用方法

    1.简介: 在Linux中可以使用函数do_gettimeofday()函数来得到精确时间.它的精度可以达到微妙,是与C标准库中gettimeofday()用发相同的函数.在Linux内核中获得时间的 ...

  10. vb.net 中 listview 中编辑 可以用 ComboBox 选择编辑数据

    Public Class ModifyLineData Dim mousePos As Point Dim pubListviewitem As ListViewItem Dim imgList As ...