1. 程式人生 > >A1-2017級演算法上機第一次練習賽 I jhljx學位運算

A1-2017級演算法上機第一次練習賽 I jhljx學位運算

Problem Description

jhljxC++程式設計課程中學習了位運算這個高階的知識,現在他開始上演算法課,決定活學活用。。

位運算中異或是一個比較神奇的操作,有0^1=1,1^0=1,0^0=0,1^1=0

於是jhljx給你了一個長度為n的陣列,讓你求出該陣列的某個子陣列(陣列中下標連續的一些元素組成的陣列)的異或值之和。

Input

輸入多組資料。
對於每組資料,第一個行為資料組數n1<=n<=1000000
第二行為n個數組元素(保證元素在int範圍內)
第三行為一個正整數k1<=k<=100),表示有k次詢問。
接下來為k行,每行為兩個數字ij1<=i,j<=n

),表示子陣列的邊界。

Output

對於每組資料,輸出每次詢問的子陣列的元素異或值之和。

Sample Input

4

1 2 3 4

3

1 2

2 4

1 4

Sample Output

3

5

4

Hint

  • 異或的性質:a^a=0,a^b=c,a^c=b
  • 資料量較大,請用scanfprintf來實現。

Trick

為了防止大家WA到停不下來,這裡給出提示,詢問時的ij大小順序不確定。

Source

改編自小米2017校園招聘筆試,改動較大,已降低難度。

Tutorial

本題幫助大家複習了sum

xor的用法。
如果你輕鬆地解決了本題,可以思考如何求解一個數組中所有子陣列異或和中最大的那個?提示:trie
小米2017校招筆試原題:求解一個數組中滿足兩個數異或值大於m的個數。n~100000
求解演算法:貪心+trie/map,複雜度O(nlg(100000))

思路