A. Sasha and a Bit of Relax(1109-有关异或前缀的思维题)---Codeforces Round #539 (Div. 1)

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:
在这里插入图片描述
It is time to continue solving the contest, so Sasha asked you to solve this task.
在这里插入图片描述
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值