題意:
輸入n
n次操作:
+ x:插入x
- x:刪除x
? x:查詢已經插入的某個數與x異或的最大異或和
思路:
01字典樹模板題
遇到這題剛好可以更新一下自己的模板(以前的太醜了)
ps:這題有個坑點是字典樹為空的情況下可能會查詢,所以開始的時候先插入乙個0
code:
#include
using
namespace std;
#define int long long
const
int maxm=
2e5+5;
struct trie
tot=0;
}void
add(
int x)
node=a[node]
[v];
cnt[node]++;
}}void
del(
int x)
}int
ask(
int x)
else
}return ans;
}}t;
signed
main()
else
if(d==
'-')
else
if(d==
'?')
}return0;
}
題意:
給n個數
要求找到乙個x,使得a[i]異或x的最大值最小,輸出這個最小值
思路:經典題,字典樹上dp
先建立字典樹
從高位開始,如果該層只有1或者只有0,則x的這一位選擇有的那個1或者0就行了,這樣結果的這一位就是0,然後從選擇的路繼續搜下去
如果該層兩個都有,則不管x這位為0或者1,結果都會出現乙個1(和另乙個異或),所以答案為(1《兩種**。
code1:
不建立字典樹,但是思路是一樣的(別人的**)
#include
using
namespace std;
#define int long long
const
int maxm=
1e5+5;
vector<
int>a;
intsolve
(vector<
int>p,
int k)
else}if
(p1.
size()
==0)return
solve
(p2,k-1)
;if(p2.
size()
==0)return
solve
(p1,k-1)
;return(1
<+min
(solve
(p1,k-1)
,solve
(p2,k-1)
);}signed
main()
cout<<
solve
(a,30
)<}return0;
}
code2:
建樹的**,也不長
#include
using
namespace std;
#define int long long
const
int maxm=
1e5+5;
struct trie
}void
add(
int x)
node=a[node]
[v];}}
}t;int
dfs(
int now,
int k)
signed
main()
cout<<
dfs(1,
30)<}return0;
}
01字典樹 貪心(順便總結字典樹模板)
題目大意 題意 給你n個數,然後給你m組詢問,每組詢問給你乙個數,輸出n個數中與該數亦或 的最大的那個數,輸出的是被亦或的那個數,不是亦或後的結果。給你n個數,然後給你m組詢問,每組詢問給你乙個數,輸出n個數中與該數亦或 的最大的那個數,輸出的是被亦或的那個數,不是亦或後的結果。思路 我用的是字典樹...
字典樹 與 01字典樹
字典樹可以降低空間複雜度 01字典樹可以降低時間複雜度。字典樹 又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較...
01字典樹 小結
為了做13年南京網路賽的一道題 學了這個01字典樹 看了別人的模板 之後切了幾道水題 現在總結一下 01字典樹的實現可以看成是把乙個數的二進位制字元化後插入到一顆一般的字典樹中 比如在01字典樹種插入3時 相當於在字典樹中插入00 00011 一共33為,這個根據具體實現不同 查詢最大異或值的時候我...