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

Posted carits

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #539 (Div. 2) C Sasha and a Bit of Relax相关的知识,希望对你有一定的参考价值。

题中意思显而易见,即求满足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
",k);
44     }
45 }
View Code

 

以上是关于Codeforces Round #539 (Div. 2) C Sasha and a Bit of Relax的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #539 (Div. 2)

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

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线

LOJ#539. 「LibreOJ NOIP Round #1」旅游路线