标签:bit else 代码 ios one 假设 情况 += include
题中意思显而易见,即求满足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\n",k); 44 } 45 }
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