最大異或和

2021-10-06 02:34:19 字數 1590 閱讀 8625

展開

題目描述

給定乙個非負整數序列 ,初始長度為nn。

有 mm 個操作,有以下兩種操作型別:

a x:新增操作,表示在序列末尾新增乙個數 xx,序列的長度 n+1n+1。

q l r x:詢問操作,你需要找到乙個位置 pp,滿足l \le p \le rl≤p≤r,使得: a[p] \oplus a[p+1] \oplus … \oplus a[n] \oplus xa[p]⊕a[p+1]⊕…⊕a[n]⊕x 最大,輸出最大是多少。

輸入格式

第一行包含兩個整數 n,mn,m,含義如問題描述所示。

第二行包含 nn個非負整數,表示初始的序列aa 。

接下來 mm行,每行描述乙個操作,格式如題面所述。

輸出格式

假設詢問操作有 tt 個,則輸出應該有 tt 行,每行乙個整數表示詢問的答案。

輸入輸出樣例

輸入 #1複製

5 52 6 4 3 6

a 1q 3 5 4

a 4q 5 7 0

q 3 6 6

輸出 #1複製45

6說明/提示

對於測試點 1-21−2,n,m \le 5n,m≤5。

對於測試點 3-73−7,n,m \le 80000n,m≤80000。

對於測試點 8-108−10,n,m \le 300000n,m≤300000。

其中測試點 1, 3, 5, 7, 91,3,5,7,9保證沒有修改操作。

0 \le a[i] \le 10^70≤a[i]≤107。

首先操作離線下來,處理出新增完所有數後數列的狀態,直接把所有字尾異或和插入進可持久化trie樹里。然後倒著處理操作,這樣新增就變成了刪除。

刪除結尾的乙個數,剩下的所有字尾異或和都會異或上刪掉的數。在全域性維護乙個tag,刪乙個數就把tag異或上它。在查詢時只要tag這一位上為1就要反著走。

#include

#define maxn 600010

#define maxdep 23

char buf[

1<<21]

,*p1=buf,

*p2=buf;

int n,m;

int sum[maxn]

;struct trie

}*root[maxn]

,tree[maxn<<5]

,*tail;

void

init()

void

build

(trie *

&p,int dep)

void

update

(trie *

&p,trie *flag,

int dep,

int i)

intquery

(trie *p,

int x,

int dep,

int limit)

signed

main()

for(

int i=

1;i<=m;i++)if

(ch==

'q')

}return0;

}

最大異或和

問題描述 給出n個整數,多組詢問求乙個給出的數與這n個數中的乙個數的最大異或的值。輸入格式 第一行乙個整數n,表示有個數字。第二行n個正整數。第三行乙個整數m,表示m個詢問。第四行m個整數,表示m個詢問的整數。輸出格式 共m行,對於每個詢問輸出最大的異或值。輸入樣例 43 5 6 7 31 4 7 ...

3261 最大異或和

給定乙個非負整數序列,初始長度為n。有m個操作,有以下兩種操作型別 1 ax 新增操作,表示在序列末尾新增乙個數x,序列的長度n 1。2 qlrx 詢問操作,你需要找到乙個位置p,滿足l p r,使得 a p xor a p 1 xor xor a n xor x 最大,輸出最大是多少。第一行包含兩...

最大異或對

acwing 143.最大異或對 在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出格式輸出乙個整數表示答案。資料範圍1 n 105,0 ai 231 輸入樣例 3 1 2 3 輸出樣例 題解 異或...