牛客3005D-子段異或-前綴+map

鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章