Trie树又称字典树、单词查找树。是一种能够高效存储和查找字符串集合的数据结构。
点我! 直接秒懂
#include<iostream>
using namespace std;
const int N=100010;
char str[N];
int son[N][26],cnt[N],idx;//son每个字符串最多有n个字母 每个节点最多有26个子节点
//cnt有多少个与查找相同的字符串
void insert(char str[]){
int p=0;
for(int i=0;str[i];i++){ //str字符串最后以\0结尾
int u=str[i]-'a';
if(!son[p][u]) son[p][u] = ++idx;
p=son[p][u];
}
cnt[p]++;
}
int query(char str[]){
int p=0;
for(int i=0;str[i];i++){
int u=str[i]-'a';
if(!son[p][u]) return 0;
p=son[p][u];
}
return cnt[p];
}
int main(){
int n;
cin>>n;
while(n--){
char op[2];//字符串读入 最后一位自动补充\0 用一个字符所以要开两个地址
//op[0] 用于实际存储,op[1] 是 \0
scanf("%s%s",op,str);
if(op[0]=='I') insert(str);
else printf("%d\n",query(str));
}
return 0;
}
详细解析看 https://www.acwing.com/solution/content/9587/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010,M=3100010;//每个数可能31位 共10万个数 idx可能会到3100000
int n;
int a[N],son[M][2],idx;//idx用于标记某处是否有数据
void insert(int x){
int p=0;//从根节点开始
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u];
}
}
int search(int x){
int p=0,res=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(son[p][!u]){
p=son[p][!u];
res=res*2+1;//后面补一位(左移) 全部数乘2 两数不同 末尾加1
}
else{
p=son[p][u];
res=res*2+0;
}
}
return res;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
insert(a[i]);//插入到树中
}
int res=0;
for(int i=0;i<n;i++){
res=max(res,search(a[i]));
}
printf("%d",res);
return 0;
}