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相关的知识,希望对你有一定的参考价值。
题中意思显而易见,即求满足al⊕al+1⊕…⊕amid=amid+1⊕amid+2⊕…⊕ar且l到r的区间长为偶数的这样的数对(l,r)的个数。
若al⊕al+1⊕…⊕amid=amid+1⊕amid+2⊕…⊕ar,我们可以推出al⊕al+1⊕…⊕amiamid+1⊕amid+2⊕…⊕ar=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 }
以上是关于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)