51nod 2128 字首異或

2021-10-08 00:00:48 字數 951 閱讀 8730

傳送門

輸入乙個長度為n(1 <= n <= 100000)陣列a[1], a[2], ..., a[n]。

輸入乙個詢問數m(1 <= m <= 100000)和m組詢問,每組詢問形如(l, r)

對於每組詢問(l, r),你需要輸出a[l] xor a[l + 1] xor ... xor a[r - 1] xor a[r],即第l個數字到第r個數字的異或。

如果你的演算法需要約n*m的時間,你將只能通過第乙個測試點。

如果你的演算法需要約n+m的時間,你將可以通過本題。

收起

第一行乙個整數n

第二行為n個整數a[1], a[2], ... a[n]

第三行乙個整數m

接下來m行,每行兩個整數l, r表示詢問。

輸出一共m行,對於每乙個詢問輸出乙個整數表示結果。
3

1 2 3

61 1

2 23 3

1 22 3

1 3

123

310

利用了字首和思想。

字首異或s[i] = s[i - 1] ^ a[i]。

由於異或運算的逆運算是它本身,也就是說兩次異或同乙個數最後結果不變,即(a ^ b) ^ b = a,則每次詢問(l,r)區間,輸出s[r]^s[l-1]。

#include #include using namespace std;

const int maxn=1e5+10;

int a[maxn],xorpre[maxn];//xorpre為字首異或陣列

int main()

int m;

cin>>m;

while(m--)

return 0;

}

51nod 1577 異或湊數

從左到右一共n個數,數字下標從1到n編號。一共m次詢問,每次詢問是否能從第l個到第r個數中 包括第l個和第r個數 選出一些數使得他們異或為k。資料量比較大。輸入請用掛 1 23 4 5 6 7 8 intread 輸出請用puts input 單組測試資料。第一行乙個整數n 0output m行,每...

子段異或(異或字首和)

傳送門 第一行乙個整數 n 代表數列長度。第二行 n 個整數,代表數列。輸出乙個整數,代表答案。示例1 複製5 1 2 3 2 1 複製 2 子段 1,3 和子段 3,5 是合法子段。首先你得知道乙個知識點就是 如果sum i 為陣列a的前i項的異或和,就是說sum i a 1 a 2 a 3 a ...

51Nod 1577 異或湊數(線性基)

description 從左到右一共 n 個數,數字下標從1到 n 編號。一共m 次詢問,每次詢問是否能從第 l 個到第 r個數中 包括第 l 個和第 r個數 選出一些數使得他們異或為 k 資料量比較大。輸入請用掛 int read 輸出請用pu tsinput 單組測試資料。第一行乙個整數n 05...