首页 > 其他分享 >trie字典树

trie字典树

时间:2023-12-09 17:14:34浏览次数:31  
标签:insert ch idx trie ++ int 异或 字典

维护一个字符串集合,支持两种操作:

  1. I x 向集合中插入一个字符串 \(x\);
  2. Q x 询问一个字符串在集合中出现了多少次。
  • 所有输入的字符串总长度不超过 \(10^5\)( 也就是节点数)
const int N=100010;
int n;
char s[N];
int ch[N][26],cnt[N],idx;

void insert(char *s){
  int p=0;
  for(int i=0; s[i]; i ++){
    int j=s[i]-'a';//字母映射
    if(!ch[p][j])ch[p][j]=++idx;
    p=ch[p][j];
  }
  cnt[p]++;//插入次数
}
int query(char *s){
  int p=0;
  for(int i=0; s[i]; i ++){
    int j=s[i]-'a';
    if(!ch[p][j]) return 0;
    p=ch[p][j];
  }
  return cnt[p];
}
int main(){
  scanf("%d",&n);
  while(n--){
    char op;
    scanf("%s%s",&op,s);
    if(op=='I')insert(s);
    else printf("%d\n",query(s));
  }
  return 0;
}

应用举例:最大异或和,一组数中找两个数,期望他们异或起来最大。

  • 分析:建01trie,对于每个数从高位开始每一位尽可能往相反方向走
  • 时间复杂度:O(31n)
const int N=100010;
int n, a[N];
int ch[N*31][2], idx;

void insert(int x){
  int p=0;
  for(int i=30; i>=0; i--){
    int j=x>>i&1; //取出第i位
    if(!ch[p][j])ch[p][j]=++idx;
    p=ch[p][j];
  }
}
int query(int x){
  int p=0,res=0;
  for(int i=30; i>=0; i--){
    int j=x>>i&1;
    if(ch[p][!j]){
      res += 1<<i; //累加位权
      p=ch[p][!j];
    }
    else p=ch[p][j];
  }
  return res;
}
int main(){
  cin>>n;
  for(int i=1; i<=n; i++)
    cin>>a[i],insert(a[i]);
  int ans=0;
  for(int i=1; i<=n; i++)
    ans=max(ans,query(a[i]));
  cout<<ans;
  return 0;
}

最小异或对

如果求最小异或对,除了字典树外,有一个结论:n个数求最小异或对,排序后,一定是相邻的一对数。因为一个数和次小数,次次小数来异或,后者高位不同的多。
最小异或对必定是n个点排完序后,相邻两个点产生的异或值中的一个
给出证明
https://blog.csdn.net/WQhuanm/article/details/129804156

标签:insert,ch,idx,trie,++,int,异或,字典
From: https://www.cnblogs.com/mathiter/p/17891186.html

相关文章

  • Trie
    \(N\)为所有字符串的最大长度和,\(M\)为字符集大小,\(idx\)用于分配节点编号。\(n\)为字符串长度,\(t[k][u]\)表示节点\(k\)且出边为\(u\)的另一侧节点编号。\(insert\):插入字符串,时间复杂度\(O(n)\)。\(visit\):遍历字符串,遍历方式和内容无定式,按需遍历。structTrie{intt......
  • 软件测试/人工智能|一文告诉你Python字典知识
    前言字典(Dictionary)是一个非常重要且灵活的工具。我们可以通过字典来存储存储键-值对,并且能够高效地根据键来访问、修改或删除值。让我们一起深入了解Python字典吧!什么是字典?字典是Python中的一种数据结构,用于存储键-值对。每个键都与一个值相关联,这种映射关系让我们能够......
  • CW初中-C102B(加强版)(CF1720D2-Trie树)
    前言这道题的弱化版CF1720D1出现在模拟赛上,大家都用了弱化版的思路即向前扫描256个元素暴力计算DP。如果想具体了解的就去看看弱化版的题解吧。但弱化版的思路(除DP外)在此题几乎毫无落脚之地,甚至毫无关系。我在考场上曾对$0\leqa_i\leq10^2$感到了疑惑——甚至都没......
  • Java 通过反射获取注解属性信息以及状态中字典
    一、创建存储对象importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/***属性对象存储类*/publicclassMetadataField{/***key对应对象中间的属性*/privateStringkey;/***字......
  • python--元组、列表、集合、字典、函数简单总结与区分
    元组:用“()”,不可修改其中的元素,有索引,tuple可建立一个元组。列表:用“【】”,可修改其中元素,有索引,可用list函数创建。集合:用“{}”,且{}相当于set()相当于set(【】),无序,无索引,可修改其中元素。字典:用”{}“,无索引,可修改其中元素,成对出现(区别于集合)。    例如:mynumber={"a":1,"b"......
  • Js中 列表里字典排序问题
    我又要给这样的列表,我想把出现"key3"的字典放到列表的后边constlist=[{key1:'value1',key2:'value2'},{key1:'value3',key2:'value4'},{key3:'value5',key2:'value6'},{key4:'......
  • Python中级之列表字典推导式和三元运算符
    列表生成式列表生成式是一种在Python中用于创建列表的简洁和优雅的语法。它允许你使用一行代码生成一个新的列表,而不必使用传统的循环语句。以下是列表生成式的基本语法:[expressionforiteminiterableifcondition]expression:用于生成新列表中每个元素的表达式。ite......
  • 上机编程字典序排序总结
    1         字典序概念2021-0319上机编程认证的入门级&工作级第二题-可漫游服务区,输出结果要求字符串按照字典序降序排序,本文对各编程语言字典序排序方法做一个总结。题目描述漫游(roaming)是一种移动电话业务,指移动终端离开自己注册登记的服务区,移动到另一服务区(地区或......
  • 字典类型——Dictionary
    简介:在C#中,字典(Dictionary)是一种集合类型,用于存储键值对(Key-Valuepairs)。它是System.Collections.Generic命名空间下的一个泛型类,可以根据给定的键快速查找和访问对应的值。用途:字典可以用来解决需要根据键进行快速查找或访问的问题。它提供了高效的键值对的存储和检索操作,适......
  • 刷题 字典树 LCP(最长公共前缀)
    2023.12.5cf1902E字典树的功能根据字典树的概念,我们可以发现:字典树的本质是把很多字符串拆成单个字符的形式,以树的方式存储起来。所以我们说字典树维护的是”字典“。那么根据这个最基本的性质,我们可以由此延伸出字典树的很多妙用。简单总结起来大体如下:1、维护字符串集合(即......