Trie树\color{green}{\texttt{Trie树}}Trie树

Trie树 是一种非常高效的字符串处理工具,它把字符串全部放在了一棵树上维护,而且通过一定的手段合并树上的节点,这使得它在空间复杂度和时间复杂度上都挺优秀的。

但是,有一个好的工具只是一个开始,重要的是应用,这里我来举一例。

UVA11488HyperPrefixSets\color{green}{\texttt{UVA11488 Hyper Prefix Sets}}UVA11488 Hyper Prefix Sets

[Problem]\color{blue}{\texttt{[Problem]}}[Problem]

  • 记 SSS 表示一个 010101 字符串的集合。
  • 记 f(S)=Sf(S)=Sf(S)=S 内所有字符串的 LCP(最长公共前缀)的长度 ×S\times S×S 内元素的个数。
  • 输入 nnn 个 010101 字符串,求出一个子集 TTT,使得 f(T)f(T)f(T) 最大。输出 f(T)f(T)f(T) 即可。

[Solution]\color{blue}{\texttt{[Solution]}}[Solution]

首先将所有的字符串建立一棵 Trie树,我们考虑如何在 Trie树 上维护 f(T)f(T)f(T) 的值。

看一个丑陋的示意图:


如果这是一棵 Trie树,如何利用它求出最大的 f(T)f(T)f(T) 呢?

首先,我们求出 Trie树 上每个节点的深度 dep\texttt{dep}dep 和有多少个节点经过了它(记为 cnt\texttt{cnt}cnt),像这样:

我们发现 Trie树 上每个节点 iii 对答案的贡献就是 Ci=cnti×depiC_i=\texttt{cnt}_{i} \times \texttt{dep}_iCi​=cnti​×depi​,所以我们在建好 Trie树 后只需要对每个节点 iii 都求一遍 CiC_iCi​,再在所有的 CiC_iCi​ 中求出一个最大值即可。这样我们就可以获得 AC 了。

等等,还有一个问题不知道大家想过没有,题目不是说要 LCP 的长度吗?我们好像并不能保证每个节点所代表的前缀字符串都是若干个字符串的 LCP 吧 (如果不能理解这句话,那就多读几次吧,是有点拗口),那这样不会求出错误的解从而导致 WA 吗?

让我们来想想:什么样的节点不可能成为若干个字符串的 LCP 呢?仔细想想可以发现,只有一个儿子的节点不可能成为若干个字符串的 LCP,如图(为了节约篇幅,我把竖着的树画横啦):

我们可不可以保证这些点的贡献不会影响答案呢?其实是可以的。因为它们只有一个儿子,所以它们的儿子一定还是这么多个字符串的前缀(即记该节点为 uuu,其儿子为 vvv,有 cntu=cntv\texttt{cnt}_u=\texttt{cnt}_vcntu​=cntv​),因为 depv>depu\texttt{dep}_v>\texttt{dep}_udepv​>depu​,所以 Cv>CuC_v>C_uCv​>Cu​,因此 uuu 考虑不考虑都不会影响答案。

[code]\color{blue}{\texttt{[code]}}[code]

const int N=1e7+100;
struct Trie_tree{int nxt[N][2],tot,cnt[N],dep[N];inline void init_trie(){memset(nxt,-1,sizeof(nxt));memset(cnt,0,sizeof(cnt));memset(dep,0,sizeof(dep));tot=0;//清空整一棵Trie树 }void insert(char s[],int len){register int u=0;//当前节点 for(int i=1;i<=len;i++){register int c=s[i]-'0';cnt[u]++;//u节点被经过了一次 if (nxt[u][c]==-1){nxt[u][c]=++tot;dep[nxt[u][c]]=dep[u]+1;}//新建一个节点 u=nxt[u][c];//建立Trie树 }cnt[u]++;//注意,最后一个点需要特别处理 }inline int query(){register int ans=0;for(int i=1;i<=tot;i++)ans=max(ans,dep[i]*cnt[i]);return ans;}
}Trie;char s[210];
int n,test_number;
int main(){scanf("%d",&test_number);while (test_number--){scanf("%d",&n);Trie.init_trie();for(int i=1;i<=n;i++){scanf("%s",s+1);int len=strlen(s+1);Trie.insert(s,len);}printf("%d\n",Trie.query());}return 0;
}附:把一个数据结构封装到一个结构体内是一个很好的习惯哦。

2020.08.14日常总结——Trie树的实际应用相关推荐

  1. 2020.08.14【RNA-Seq流程】丨将HTseq生成的基因COUNT值转换为FPKM值

    2021.04.22更新:2.0版本 count转换FPKM介绍 公式介绍 R语言脚本 公式介绍 下方公式是FPKM的综述文章写的,参数并不好理解,但是对数量级表示很明白 https://harold ...

  2. (十一:2020.08.28)CVPR 2017 追踪之论文纲要(译)

    CVPR 2017 追踪之论文纲要(修正于2020.08.28) 讲在前面 论文目录 讲在前面 论坛很多博客都对论文做了总结和分类,但就医学领域而言,对这些论文的筛选信息显然需要更加精细的把控,所以自 ...

  3. (十三:2020.08.28)CVPR 2015 追踪之论文纲要(译)

    CVPR 2020 追踪之论文纲要(修正于2020.08.27) 讲在前面 论文目录 讲在前面 论坛很多博客都对论文做了总结和分类,但就医学领域而言,对这些论文的筛选信息显然需要更加精细的把控,所以自 ...

  4. mysql索引用trie树_数据结构与算法之美【完整版】

    资源目录: ├─01-开篇词 (1讲) │ ├─00丨开篇词丨从今天起,跨过"数据结构与算法"这道坎.html │ ├─00丨开篇词丨从今天起,跨过"数据结构与算法&qu ...

  5. (十四:2020.08.28)CVPR 2014 追踪之论文纲要(译)

    CVPR 2020 追踪之论文纲要(修正于2020.08.28) 讲在前面 论文目录 讲在前面 论坛很多博客都对论文做了总结和分类,但就医学领域而言,对这些论文的筛选信息显然需要更加精细的把控,所以自 ...

  6. 心音数据库_小V云端数据库 | 2020.9.14—2020.9.18

    桂花的芬芳 在雨后空气中弥散开来 似为湿润的情绪 赠予了一丝甜蜜 小V云端数据库 2020.9.14-2020.9.18 资讯情报关键词 健康.示范.安全 V宝体检,助力成长 2020年9月14日上午 ...

  7. POJ 2418 Hardwood Species(trie 树)

    题目链接 开始想用map的,字典序不会搞,还是老老实实的用trie树把.好久没写了,忘得差不多了. 1 #include <iostream> 2 #include <cstdio& ...

  8. 算法 | 动画+解析,轻松理解「Trie树」

    Trie这个名字取自"retrieval",检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 ...

  9. 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树......

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 上篇文章我们主要介绍了线性数据结构,本篇233酱带大家看看 无所不 ...

最新文章

  1. 2019最新版本的PanDownload纯净版,网盘满速下载和搜索神器,追剧和动漫新番必不可少的下载工具【亲测有效】
  2. php++mpdf.mpdf,使用php第三方包mpdf将网页装换成pdf文件【2】
  3. SDUT 3379 数据结构实验之查找七:线性之哈希表
  4. [leetcode]LRU Cache
  5. android uri内部协议,Android 解析 Intent 协议并打开程序 – 热爱改变生活
  6. 使用AUTODYN超高速撞击仿真
  7. 大学语文复习详细资料
  8. 利用持续同调在基于深度学习的分割框架中引入显式的拓扑学约束
  9. [FPGA] 1、Artix-7 35T Arty FPGA 评估套件学习
  10. Unity之数据持久化——Json
  11. itext html 转换pdf后 字体加粗,java - 如何使用ITEXTRenderer将HTML转换为PDF时设置新的不同字体 - 堆栈内存溢出...
  12. 抓取检测之Closing the Loop for Robotic Grasping: A Real-time, Generative Grasp Synthesis Approach
  13. 第2章 Maven的安装与配置
  14. php自动切换背景,刷新页面后让WordPress背景随机切换
  15. 人、机、料、法、环,全面解析,请收好
  16. 美工要冬的html语言,什么是美工css?
  17. 面试前,一定要准备好这三件重要的事
  18. Springboot毕业设计毕设作品,微信买菜小程序系统 开题报告
  19. 使用python matplotlib画二维图,设置坐标轴刻度和colorbar刻度ticks
  20. 餐饮业管理系统(基于C++的)

热门文章

  1. steam游戏上架流程一:使用官方SDK上传游戏
  2. java基础知识总结,javaweb参考资料大全
  3. 解决laravel-admin 树状模型删除失效
  4. 苹果如何修改无线DNS服务器,苹果路由器dns怎么设置
  5. SparkSQL 创建 DataFrame 的方式
  6. django 进阶第二天 生鲜超市学习 model
  7. 纯色背景图片去除底色工具发布,将背景变透明
  8. svn常用命令以及冲突解决
  9. 权威一文解读人工智能等级考试证书超高含金量
  10. 高数--反常积分与无穷级数的关系