problem:1248
time limit:2000ms
memory limit:65535k
有乙個數列包含n個正整數a[1]~a[n](1<=n<1e5,0<=a[i]<1e9),現在有q次操作(q<1e5),每次操作是以下兩種操作中的一種:1、輸入x,對這n個數分別異或x;
2、輸入x,求數列中的某個數與x異或的最大值(即從陣列中找乙個數,使其與x異或值最大);
第一行為t,表示有t(t<=10)組資料,每組資料的第一行為n和q,表示這個數列長為n,q次操作。然後輸入這n個數。接下來,每次操作輸入一行兩個數op(op為1或者2)和x(0<=x<1e9),op=1表示進行操作1,op=2表示進行操作2;
每次進行操作2時,用一行輸出最大的異或值;
14 36 7 5 4
1 32 4
2 5
33
cjj
異或是對應的每位相同為0,不同為1.
根據題意,我們會想到肯定要讓x和每位都與他盡量不同的抑或比較好。
所以可以建立一顆字典樹,先把整個陣列都插入字典樹。字典樹的每個分叉就表示0,1的分界。
從高位到低位。這樣我們就可以一層一層,一位一位的比較,每次走不同的那邊就好了。
#include #include#includeusing namespace std;
const int maxn=1e5+5;
struct node
tree[40*maxn];
int root,tot;
int newnode()
void insert(int x)
int y=0;
while(q--)
else}}
return 0;
}
字典樹處理《異或》
題目 問題很簡單,現在有乙個陣列a1,a2,a3 an。你的任務就是找到乙個連續子段 l,r 使得al al 1 ar達到最大。input 多組輸入,每組有兩行。第一行有乙個整數n 1 n 10 5 表示陣列的元素個數。第二行有n個元素,依次表示陣列的元素。0 ai 10 6 output 每組輸出...
POJ 3764 (異或 字典樹)
早就聽過用字典樹求異或最大值,然而沒做過。發現一碰到異或的題就gg,而且因為以前做過的一道類似的題 事實上並不類似 限制了思路,蠢啊 題意 一棵帶權的樹,求任意兩點間路徑異或的最大值。題解 設xor a,b 是求a,b間路徑的異或值,那麼xor a,b xor root,a xor root,b 因...
奶牛異或(01字典樹)
題意 讓你找乙個連續區間異或和最大,如果有相同的,則輸出斷點較小的。題解 01字典樹,利用字首和的思想進行求解,我們在插入字首的同時,也在不斷的更新最大值。我們查詢當前 二進位制字串與已經插入的 二進位制字串中的哪乙個異或和最大?找到最大的那個,讀取這個字首和是到誰結束的,來判斷是否要更新 keep...