鏈接:https://ac.nowcoder.com/acm/contest/3005/D
來源:牛客網
題目描述:
輸入一個數列a,你需要輸出其中異或值爲0的不同子段的數量。一個子段 [l,r] (1≤l≤r≤n)的異或值爲al⊕al+1⊕al+2⊕…⊕ar,其中⊕符號代表異或運算。
兩個子段被視爲相同的,當且僅當其開始和結束位置均對應相同。
輸入描述:
第一行一個整數 n ,代表數列長度。
第二行 n 個整數,代表數列。
輸出描述:
輸出一個整數,代表答案。
輸入樣例:
5
1 2 3 2 1
輸出樣例:
2
核心思想:
定義k前綴異或值:前k個數的異或值。
一個子段 [l,r] 的異或值爲0,當且僅當l-1前綴異或值==r前綴異或值
用STL的map[i]表示前綴異或值i出現的次數,遍歷數組,累加並更新map即可。
代碼如下:
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
const int N=2e5+20;
map<int,int>mp;
int main()
{
int n,x,t=0;//t爲前綴異或值
ll ans=0;
cin>>n;
mp[0]=1;//初始化0的時候
while(n--)
{
scanf("%d",&x);
t^=x;
ans+=mp[t];//累加
mp[t]++;//更新
}
cout<<ans<<endl;
return 0;
}