A1-2017級演算法上機第一次練習賽 I jhljx學位運算
阿新 • • 發佈:2018-12-27
Problem Description
jhljx在C++程式設計課程中學習了位運算這個高階的知識,現在他開始上演算法課,決定活學活用。。
位運算中異或是一個比較神奇的操作,有0^1=1,1^0=1,0^0=0,1^1=0。
於是jhljx給你了一個長度為n的陣列,讓你求出該陣列的某個子陣列(陣列中下標連續的一些元素組成的陣列)的異或值之和。
Input
輸入多組資料。
對於每組資料,第一個行為資料組數n(1<=n<=1000000)
第二行為n個數組元素(保證元素在int範圍內)
第三行為一個正整數k(1<=k<=100),表示有k次詢問。
接下來為k行,每行為兩個數字i和j(1<=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。
- 資料量較大,請用scanf和printf來實現。
Trick
為了防止大家WA到停不下來,這裡給出提示,詢問時的i和j大小順序不確定。
Source
改編自小米2017校園招聘筆試,改動較大,已降低難度。
Tutorial
本題幫助大家複習了sum和 xor的用法。
如果你輕鬆地解決了本題,可以思考如何求解一個數組中所有子陣列異或和中最大的那個?提示:trie
小米2017校招筆試原題:求解一個數組中滿足兩個數異或值大於m的個數。n~100000
求解演算法:貪心+trie/map,複雜度O(nlg(100000))
思路