Trie树（字典树、单词查找树）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; }