码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #539 (Div. 2) C Sasha and a Bit of Relax

时间:2019-02-17 23:49:43      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:bit   else   代码   ios   one   假设   情况   +=   include   

题中意思显而易见,即求满足alal+1amid=amid+1amid+2ar且l到r的区间长为偶数的这样的数对(l,r)的个数。

若alal+1amid=amid+1amid+2ar,我们可以推出alal+1amiamid+1amid+2ar=0;反推也是可以成立的。

我们已知任何数0对异或都等于本身。所以当前数异或一段数之后等于本身,那么异或之后的这段数肯定是异或为0的,我们只需要知道这一段是不是长度为偶数即可。

我们从头异或一道,若异或到某个数之后这个数在曾经出现过,我们就加上它可组成偶数段所有出现的次数即可。若全部异或为0,也是一种情况,我们假设0一开始也出现一次就好了。

用两个map统计奇偶(代码就能看懂)

技术图片
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<string>
 5 #include<algorithm>
 6 #include<set>
 7 #include<map>
 8 using namespace std;
 9 typedef long long ll;
10 map<ll,ll>p1;
11 map<ll,ll>p2;
12 ll a[300005];
13 int main()
14 {
15     ll n,t,k,i,j;
16     while(scanf("%I64d",&n)!=EOF)
17     {
18         k=0;
19         p1.clear();
20         p2.clear();
21         scanf("%I64d",&j);
22         p2[j]=1;
23         p1[0]=1;
24         for(i=1;i<n;i++)
25             {
26                 scanf("%I64d",&t);
27                 j^=t;
28                 if(i%2==0)
29                 {
30                     if(p2[j]!=0)
31                         k+=p2[j];
32                         p2[j]++;
33                 }
34                 else
35                 {
36 
37                     if(p1[j]!=0)
38                         k+=p1[j];
39 
40                         p1[j]++;
41                 }
42             }
43             printf("%I64d\n",k);
44     }
45 }
View Code

 

Codeforces Round #539 (Div. 2) C Sasha and a Bit of Relax

标签:bit   else   代码   ios   one   假设   情况   +=   include   

原文地址:https://www.cnblogs.com/Carits/p/10393159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!