牛客寒假訓練營4 D 子段異或

2021-10-02 18:51:36 字數 1071 閱讀 3884

題目描述

輸入乙個數列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...