Sasha and a Bit of Relax

题目链接http://codeforces.com/contest/1109/problem/A
time limit per test:1 second

memory limit per test:256 megabytes
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:
A. Sasha and a Bit of Relax(1109-有关异或前缀的思维题)---Codeforces Round #539 (Div. 1)_编程开发
It is time to continue solving the contest, so Sasha asked you to solve this task.
A. Sasha and a Bit of Relax(1109-有关异或前缀的思维题)---Codeforces Round #539 (Div. 1)_Codeforces_02
Examples

Input
5
1 2 3 4 5

Output
1

Input
6
3 2 2 3 7 6

Output
3

Input
3
42 4 2

Output
0

Note

Be as cool as Sasha, upsolve problems!

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

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


题目大意:给你一个数列,数列中有区间(l,r)其中有偶数个数字,使得其前半段l~mid的异或=后半段mid+1 ~r的异或相等。让你寻找有多少个这样的区间。
首先,要计算al⊕al+1⊕……⊕amid我们可以使用前缀和的思想来进行预处理
不过前缀和的al+al+1+……amid=sum[mid]-sum[l-1]。但异或的话不是“-”,只是将它改成了“^"。也就是说al⊕al+1⊕……⊕amid=sum[mid] ^sum[mid-1]。那么要使得两边异或后的值相等也就是sum[mid] ^sum[mid-1]=sum[mid] ^sum[r];消掉sum[mid]后也就是sum[mid-1]=sum[r]。然后for一遍寻找相等值出现的次数就行了。
不过对于偶数的处理,我们只需建立两个数组来各自存放奇数位和偶数为的次数就行了(奇奇为偶、偶偶为偶)
一下就是AC代码:

#include <cstdio>
int a[300040],sum[300040];
int num[(1<<20)+5][2];
int main()
{
	int n;
	scanf ("%d",&n);
	for (int i=1; i<=n; i++){
		scanf ("%d",&a[i]);
		if (i==1) sum[i]=a[i];
		else sum[i]=sum[i-1]^a[i];
	}
	num[0][0]=1;
	long long ans=0;
	for (int i=1; i<=n; i++){		
		ans+=num[sum[i]][i&1];
		num[sum[i]][i&1]++;
	}
	printf ("%lld\n",ans);
	return 0;
}