#include<iostream>#include<string>#include<unordered_map>usingnamespace std;constint maxn =1e5+10;int trie[maxn][26], count[maxn];int index =0;voidinsert(const string& str){int cur =0;for(int i =0; i < str.size();++i){int col_idx = str[i]-'a';// 当前字符在字典树路径中未出现,插入并指定序号if(trie[cur][col_idx]==0)
trie[cur][col_idx]=++index;// 沿着树中路径向下查询
cur = trie[cur][col_idx];}// 当前路径结尾处标记累加已出现次数
count[cur]++;}intquery(const string& str){int cur =0;for(int i =0; i < str.size();++i){int col_idx = str[i]-'a';if(trie[cur][col_idx]==0)return0;
cur = trie[cur][col_idx];}return count[cur];}intmain(){int N;
cin >> N;char op;
string str;for(int i =0; i < N;++i){
cin >> op >> str;if(op =='I')insert(str);else
cout <<query(str)<< endl;}return0;}
AcWing 143. 最大异或对
#include<iostream>#include<algorithm>usingnamespace std;constint N =1e5+10, M =31e5+10;int n =0, index =0;int nums[N], trie[M][2];// int re[M];// 构建树voidinsert(int num){int cur =0;for(int i =31; i >=0;--i){int col_idx =(num >> i)&1;if(trie[cur][col_idx]==0)
trie[cur][col_idx]=++index;
cur = trie[cur][col_idx];}// re[cur] = num;}// 查询树中与当前元素异或值最大的节点// 根据对应比特位上是否相异确定查询路径intquery(int num){int ret =0, cur =0;for(int i =31; i >=0;--i){int col_idx =(num >> i)&1;if(trie[cur][!col_idx]!=0){
ret +=1<< i;
cur = trie[cur][!col_idx];}else
cur = trie[cur][col_idx];}// return num ^ re[cur];return ret;}intmain(){
cin >> n;for(int i =0; i < n;++i){
cin >> nums[i];insert(nums[i]);}int ret =0;for(int i =0; i < n;++i)
ret =max(ret,query(nums[i]));
cout << ret;return0;}