題目描述
輸入乙個數列a,你需要輸出其中異或值為0的不同子段的數量。乙個子段 [l,r] (1≤l≤r≤n1 \le l \le r \le n1≤l≤r≤n)的異或值為al⊕al+1⊕al+2⊕…⊕ara_l \oplus a_ \oplus a_ \oplus \ldots\oplus a_ral⊕al+1⊕al+2⊕…⊕ar,其中⊕\oplus⊕符號代表異或運算。
兩個子段被視為相同的,當且僅當其開始和結束位置均對應相同。
輸入描述:
第一行乙個整數 n ,代表數列長度。
第二行 n 個整數,代表數列。
輸出描述:
輸出乙個整數,代表答案。
示例1輸入複製5
1 2 3 2 1
輸出複製
說明子段 [1,3] 和子段 [3,5] 是合法子段。
備註:n≤200000,0≤ai≤230−1n \le 200000, 0 \le a_i \le 2^-1n≤200000,0≤ai≤230−1
首先,我們先把1-9的連續異或結果寫下來,發現[1]=[2]=[3]=[4]=0,[5]=[6]=[7]=[8]=[9]=1,又因為出現相同的異或結果,兩者異或結果為0,所以滿足題意。接下來我們只需要找出現相同結果的有幾次就好,我們可以再建立乙個map容器,因為結果可能會很大,所以用map,map的大小是ll,裡面訪問int數字。
#include
#include
using
namespace std;
#define ll long long
const ll maxn=
200010
;ll a[maxn]
;mapint> mapn;
ll n;
intmain()
ll sum=0;
ll num=0;
mapn[0]
=1;//記錄剛開始的num=0
for(
int i=
0;i)printf
("%lld\n"
,sum)
;return0;
}
2020牛客寒假演算法基礎集訓營4 D 子段異或
題目描述 輸入乙個數列a,你需要輸出其中異或值為0的不同子段的數量。乙個子段 思路 考慮它的字首和,如果區間 include pragma warning disable 6031 pragma warning disable 4996 define mem a,b memset a,b,sizeo...
2020牛客寒假演算法基礎集訓營4 D 子段異或題解
兩個核心公式 1 l,r 1,r 1,l 1 2 a a 0 充要 題意要求求出異或值為0的子段數,我們可以通過記錄每個值的字首異或值來推出某個區間的異或值,如 2,3 的異或值可以通過 1,3 1,1 來推出 並且當且僅當 1,3 1,1 0時,2,3 0。可何時 1,3 1,1 才能等於0呢?結...
2020牛客寒假演算法基礎集訓營4 D 子段異或
考察點 位運算,字首和,異或的性質和應用 坑點 0 l 的異或值是 0 的話也是乙個區間 相同的值可能有多個,那麼這時候區間就會有多個 x x 1 2 怎麼求區間異或值為 0 的區間呢 在求這個之前,可以想一下怎麼求區間 和 為 0 的區間呢?我們知道乙個區間和或者區間異或 l,r 都可以表示為 s...