字典树功能:

给定n个主串平均长度为len1,m个模式串平均长度为len2,问m个模式串分别在n个字符串中出现了几次?

首先如果用kmp算法,对于n个主串每个主串都和m个模式串进行比较,那么对于每一个主串来说相当于进行了m次kmp所以单个主串需要的时间是mlen1,有n个主串则时间复杂度为O(nmlen1)而接下来介绍的字典树的时间复杂度为O(nlen1+mlen2)

字典树:

(1) 时间复杂度假设所有字符串长度之和为n,构建字典树的时间复杂度为O(n)
假设要查找的字符串长度为k,查找的时间复杂度为O(k)

(2) 空间复杂度有公共前缀的单词只需要存一次公共前缀,节省了空间

  • 1、维护字符串集合(即字典)。

  • 2、向字符串集合中插入字符串(即建树)。

  • 3、查询字符串集合中是否有某个字符串(即查询)。

  • 4、统计字符串在集合中出现的个数(即统计)。

  • 5、将字符串集合按字典序排序(即字典序排序)。

  • 6、求集合内两个字符串的LCP(Longest Common Prefix,最长公共前缀)(即求最长公共前缀)。

模板: HDU1251


int cnt=0;
int tree[maxn][30];
int num[maxn];//统计前缀出现次数
void insert(string s){int u=0;for(int i=0;i<s.size();i++){int now=s[i]-'a';if(!tree[u][now]){tree[u][now]=++cnt;}u=tree[u][now];num[u]++;}
}
int find(string s){int u=0;for(int i=0;i<s.size();i++){int now=s[i]-'a';if(!tree[u][now]){return 0;}u=tree[u][now];}return num[u];
}

字典树用来加速查询,即n个模式串中的出现的情况,例如最大最小值等,假设有n个字符串它们的平均长度是K,如果用map存这n个字符串,查询每一个时的用时是log(n),如果用字典树来存这n个字符串,那么查询每一个时的用时是K,当K比log(n)小时就可以加速查询

https://ac.nowcoder.com/acm/contest/11222/F

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e9+7;
const int maxn=4e5+5;
struct node{int l,r;
};
node a[maxn];
int cnt[15]; //分别用来表示1-10时候的cnt
int tree[15][maxn][15];
int val[15][maxn]; //统计长度为1-10时分别的最小答案
vector<int>b(15);
void insert(vector<int>v,int vall,int changdu){//cout<<"insert ";/*for(int i=1;i<=changdu;i++){cout<<v[i];}*///cout<<"\n";int now=0;for(int i=1;i<=changdu;i++){if(tree[changdu][now][v[i]]){now=tree[changdu][now][v[i]];}else{now=tree[changdu][now][v[i]]=++cnt[changdu];}       }val[changdu][now]=min(val[changdu][now],vall);
}
int find(vector<int>v,int changdu){int now=0;for(int i=1;i<=changdu;i++){if(!tree[changdu][now][v[i]]){return -1;}now=tree[changdu][now][v[i]];}return val[changdu][now];
}
signed main(){for(int i=1;i<=10;i++){for(int j=0;j<=maxn-1;j++){val[i][j]=inf;}}for(int i=1;i<=10;i++){b[i]=i;insert(b,0,i);}int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i].l>>a[i].r;}for(int i=1;i<=10;i++){for(int j=1;j<=n;j++){  //枚举右端点   for(int k=1;k<=i;k++){b[k]=k;}for(int k=j;k>=1;k--){ //枚举左端点从k到j交换 int ll=a[k].l,rr=a[k].r;if(rr>i){break;}//cout<<"len"<<i;//cout<<" ll "<<ll<<" rr "<<rr<<"\n"; swap(b[ll],b[rr]);insert(b,j-k+1,i);}}}while(m--){int changdu;cin>>changdu;for(int i=1;i<=changdu;i++){cin>>b[i];}cout<<find(b,changdu)<<"\n";}
}

字典树求异或最大值

https://codeforces.com/contest/1658/problem/D2

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
const int maxn=6e5+5;
int a[maxn];
int tree[maxn][2];
int cnt=0;
void init(){for(int i=0;i<=cnt;i++){tree[i][0]=tree[i][1]=0;}cnt=0;
}
void insert(int x){int u=0;for(int i=32;i>=0;i--){int now=(x>>i)&1ll;if(!tree[u][now]){tree[u][now]=++cnt;}u=tree[u][now];}
}
int find_max(int x){  //找到所有数里面异或x最大的数int u=0;int ans=0;for(int i=32;i>=0;i--){int now=(x>>i)&1ll;int want=now^1ll;      if(tree[u][want]){u=tree[u][want];ans+=(1ll<<i);}else{u=tree[u][want^1ll];}}return ans;
}
int find_min(int x){int u=0;int ans=0;for(int i=32;i>=0;i--){int now=(x>>i)&1ll;int want=now;    if(tree[u][want]){u=tree[u][want];}else{ans+=(1ll<<i);u=tree[u][want^1ll];}}return ans;
}
void solve(){int l,r;cin>>l>>r;for(int i=l;i<=r;i++){cin>>a[i];insert(a[i]);}for(int i=l;i<=r;i++){int x=a[i]^l;int minn=find_min(x);int maxx=find_max(x);if(minn==l&&maxx==r){cout<<x<<"\n";init();return;}}
}
signed main(){int t;cin>>t;while(t--){solve();}
}

字典树(tire树)相关推荐

  1. 基于Tire树和最大概率法的中文分词功能的Java实现

    对于分词系统的实现来说,主要应集中在两方面的考虑上:一是对语料库的组织,二是分词策略的制订. 1.   Tire树 Tire树,即字典树,是通过字串的公共前缀来对字串进行统计.排序及存储的一种树形结构 ...

  2. tire树的存储和并查集

    tire树 tire树又称字典树,是一种能够高效存储和查找字符串集合的数据结构. 图形如下图所示 每个节点表示一个字符串中的字符,从根节点到灰色节点的一条路径表示一个字符串(灰色节点表示是某个单词的结 ...

  3. Tire树(字典树-字符串快速查找)

    前言 一.Tire树是什么? 二.怎么建立tire树 1.字符串插入Tire树入 2.查找字符串 总结 前言: 最近是在复习基础算法,正好复习到了数据结构,所以写了自己对Tire树的理解,数据结构对我 ...

  4. 数据结构4:Tire树入门

    以下来源于百度百科: 在计算机科学中,Trie,又称字典树.单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串). 特点:利用字符串的公 ...

  5. tire树代码示例和例题

    tire树 [模板]字典树 题目描述 给定 n n n 个模式串 s 1 , s 2 , - , s n s_1, s_2, \dots, s_n s1​,s2​,-,sn​ 和 q q q 次询问, ...

  6. UVa 11732 (Tire树) strcmp() Anyone?

    这道题也是卡了挺久的. 给出一个字符串比较的算法,有n个字符串两两比较一次,问一共会有多少次比较. 因为节点会很多,所以Tire树采用了左儿子右兄弟的表示法来节省空间. 假设两个不相等的字符串的最长公 ...

  7. HDU 1247 Hat’s Words 字典树(Trie树)

    HDU 1247 Hat's Words 字典树(Trie树) 字典树的建立是应该都是一样的 下面是我的做法: 建立完后, 对每一个单词都进行find_string()判断是否符合, 分别对其分成两半 ...

  8. php tire树,Immutable.js源码之List 类型的详细解析(附示例)

    本篇文章给大家带来的内容是关于Immutable.js源码之List 类型的详细解析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.存储图解 我以下面这段代码为例子,画 ...

  9. 数据结构 - Tire 树

    文章目录 一.Tire 树 1. Tire 树介绍 2. 优缺点及性质 3. 具体实现可见例题 Tire 字符串统计 二.Tire 树例题--Tire 字符串统计 具体实现 1. 实现过程 2. 代码 ...

最新文章

  1. java的重点是什么_你知道初学者学习Java的重点是什么吗?
  2. css选择器 nth-child
  3. 下列关于php说法错误的,PHP试题
  4. lstm中look_back的大小选择_基于机器学习检测僵尸网络中的域名生成算法
  5. Theano2.1.11-基础知识之稀疏
  6. lnmp mysql主从_LNMP linux下mysql主从复制 _好机友
  7. 用python画漂亮图-大部分人都不知道-Python竟能画这么漂亮的花,帅呆了
  8. 一个女算法程序媛的日常
  9. 政府机构网络安全实战
  10. netscape.exe_评论-Netscape 6.1
  11. 外媒所言非虚,苹果降价或许是真的在清库存
  12. 微信开发之data:image/png;base64,
  13. CM系统应用源码分析与rom定制
  14. Word2Vec对新闻进行分类
  15. 丢手帕程序C语言,约瑟夫问题,即丢手帕游戏
  16. web player html5源码,GitHub - WEBHH/DanmuPlayer: Html5弹幕视频播放器插件
  17. 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
  18. C/C++二维码生成库qrencode的使用
  19. (程序员情感三部曲之二)程序员如何找女朋友
  20. 使用OpenCV调整图像大小

热门文章

  1. 疫情下,京津复工通勤指南
  2. 新学期Flag已立,期待期末给自己一份满意的答卷
  3. 使用栈实现计算器java(括号、加减、乘除)v2.0
  4. 让你的电脑美到飞起!windows电脑主题、鼠标、壁纸等。。。
  5. 元素定位不到的常见情况和解决办法
  6. 广东高职高考数学可以用计算机吗,广东高职高考多少分可以过
  7. Facebook和旗下Instagram起诉4家中国公司商标侵权
  8. 模型的可解析性特征重要性调研
  9. 基于xilinx fpga的ofdm通信系统基带设计_仪器设备研制 | 基于AD9361的雷达干扰信号模拟器设计...
  10. GIS应用:Shapefile导出到cad方法