nefu1248智力異或 字典樹

2021-08-15 03:45:31 字數 1012 閱讀 8750

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時,用一行輸出最大的異或值;

1

4 36 7 5 4

1 32 4

2 5

3

3

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...