2020牛客寒假算法基礎集訓營4D.子段異或(位運算)

連接:https://ac.nowcoder.com/acm/contest/3005/Dios

 

題意:數組

給一個數組,問有多少個子序列的異或和爲0spa

思路:code

首先咱們須要一個定義一個前綴和數組sum[i],表明從1到i這段的異或和blog

那麼神奇的事情來了,sum[l-r]=sum[l-1]^sum[r],由於他們相同的部分異或起來爲0,這也是與普通前綴和不一樣的部分ci

若是這段的異或和爲0,那麼sum[l-1]^sum[r]=0,也就是sum[l-1]=sum[r],所以咱們只須要統計每一個前綴和的數值,看有多少前綴和相同get

最後答案就爲∑cnti*(cnti-1)it

#include<iostream>
#include<algorithm>
#include<map>
 using namespace std;
 const int maxn=2e5+10;
 typedef long long ll;
 ll a[maxn];
 map<ll,ll> s;
 int main()
 {
     ll ans=0,n,sum=0;
     cin>>n;
     s[0]=1;
     for(int i=1;i<=n;i++){
         scanf("%lld",&a[i]);
         sum^=a[i];
         ans+=s[sum];
         s[sum]+=1;
     }
    cout<<ans<<endl;
    return 0;
 }
相關文章
相關標籤/搜索