[week15] B - ZJM与生日礼物(选做)—— 字典树
文章目录
- 题意
- Input
- Output
- 输入样例
- 输出样例
- 提示
- 分析
- 总结
- 代码
题意
ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了。只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM。
Q老师 给了 ZJM 一些仅有 01 组成的二进制编码串, 他问 ZJM:是否存在一个串是另一个串的前缀.
Input
多组数据。每组数据中包含多个仅有01组成的字符串,以一个9作为该组数据结束的标志。
Output
对于第 k 组数据(从1开始标号),如果不存在一个字符串使另一个的前缀,输出"Set k is immediately decodable",否则输出"Set k is not immediately decodable"。
每组数据的输出单独一行
输入样例
01
10
0010
0000
9
01
10
010
0000
9
输出样例
Set 1 is immediately decodable
Set 2 is not immediately decodable
提示
分析
这也是一道用字典树解决的字符串问题。
- 字典树
1. 什么是字典树?字典树的作用?
字典树就是指的每个节点存储的都是一个字符的树。从根到任意一个叶子经过的路径就代表着一个完整字符串。
字典树主要用于判断一个字符是否是另一个字符的前缀。
2. 字典树类型
字典树类型:
- 节点
每个节点有唯一的序号标记 - 根节点
- 孩子数组
用一个二维数组记录每一个节点存在哪些孩子。
child[n][m]:n代表节点序号,m代表孩子类型,存储的是孩子节点的序号。 - 结尾数组
用一个数组标记每个字符串的结尾节点。
flag[n]:n代表节点序号。若赋为true说明该节点是一个字符串的结尾。
3. 字典树构造
每一次插入都从根节点开始,依次插入字符串中的每一个字符:
- 判断当前节点i是否已经存在和当前待插入字符类型x相同的孩子
- 若没有,则新建节点(最新序号tot + 1)存储该字符。在孩子数组中,将节点i对应字符类型x的数组空间赋值为该新节点序号tot + 1 ——> child[i][x] = tot + 1
- 若已有,则判断该字符是否为当前字符串的结尾或是否为已存在字符串的结尾:
- 若是当前字符串的结尾,则说明当前字符串一定被另一个已插入字符串包含;否则继续插入
- 若是已存在(已插入树中)字符串的结尾,则说明当前正在插入的字符串一定包含一个完整的字符串;否则继续插入
- 当前字符插入后,将判断节点更新为新插入的节点,重复上述步骤
- 当字符串插入完成后,将最后一个判断节点标记为结尾节点
4. 字典树判断原理
根据前面的介绍我们已经知道,从根到任意叶子的路径都是一个完整的字符串。
但是可以想到,若字符串a包含字符串b,则字符串b无法从根走到任何一个叶子,而是属于a这条从根到叶子的路径中的一部分。
显然,判断两个字符串之间结尾节点的关系就是判断两个字符串包含关系的关键。
若仅存在两个字符串a和b,其中a已插入字典树中:
- 若当前b的某一个字符已经被标记为结尾节点,则代表a字符串从根开始沿相同路径到该字符处结束。显然b包含a。
- 若b的最后一个字符已经存在于字典树中,则代表b在完整走完a这条路径之前就提前结束。显然a包含b。
需要注意的是:
假设两个字符串a和b,长度分别为l1和l2(l1 >= l2)
若a和b前l3长度都完全相同,则显然它们插入在字典树的位置完全相同。
若第l3 + 1个字符不同,则a和b的第l3 + 1个字符将分别被插入在第l3个字符的不同孩子位置处。
就算剩下的所有字符都相同,a和b在第l3 + 1个之后的所有字符都将属于完全不同的路径。
这就是前面判断的基础。若一个节点已存在,则说明其一定属于于一个已存在的字符串中,只要该节点是一个结尾节点,不论其属于谁,都一定代表着存在包含关系。
- 题目分析
这就是一道典型的字典树问题。需要注意的是这个题目中涉及到的字符类型只有2种,即0和1。因此孩子数组中第二维只需要设置为2,即代表对每个节点来说会有0和1两个类型的孩子。
总结
- 字符串还挺有意思
[week15] B - ZJM与生日礼物(选做)—— 字典树相关推荐
- GCPC 2013_A Boggle DFS+字典树 CSU 1457
上周比赛的题目,由于那个B题被神编译器的优化功能给卡了,就没动过这个题,其实就是个字典树嘛.当然,由于要在Boggle矩阵里得到初始序列,我还一度有点虚,不知道是用BFS还是DFS,最后发现DFS要好 ...
- HDU 5687 字典树入门
Problem C Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- 【Week15作业 B】ZJM与生日礼物【字典树】
题意: ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了.只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM. Q老师 给了 ZJM 一些仅有 01 组成的二进制编 ...
- w15作业--ZJM 与生日礼物(选做)
题意: ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了.只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM. Q老师 给了 ZJM 一些仅有 01 组成的二进制编 ...
- [week15] C - ZJM与纸条(选做)—— KMP算法
文章目录 题意 Input Output 输入样例 输出样例 提示 分析 总结 代码 题意 ZJM 的女朋友是一个书法家,喜欢写一些好看的英文书法.有一天 ZJM 拿到了她写的纸条,纸条上的字暗示了 ...
- 字典树 ZJM 与生日礼物
题意: ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了.只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM. Q老师 给了 ZJM 一些仅有 01 组成的二进制编 ...
- ZJM 与生日礼物(字典树)
问题描述 ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了.只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM. Q老师 给了 ZJM 一些仅有 01 组成的二进制 ...
- ZJM与生日礼物【字典树】
问题描述 ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了.只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM. Q老师 给了 ZJM 一些仅有 01 组成的二进制 ...
- WEEK 15 B ZJM 与生日礼物
题目 ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了.只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM. Q老师 给了 ZJM 一些仅有 01 组成的二进制编码 ...
最新文章
- Python培训教程:Python有哪些比较重要的内置函数?
- spring-aop-01
- python的.arsort()函数的用法
- centos mysql pid_centos7 mysql The server quit without updating PID file(错误解决)
- 理解CapsuleNetwork2
- RegularExpressions(2) RegularExpressions 支持的正则表达式语法
- 网络爬虫基本原理(二)
- React.js小书总结
- python安装pil库-python第三方库PIL.Image安装
- Linux du命令和df命令
- 计算机及数码产品营销课后题,职业教育课程改革创新系列教材:计算机及数码产品营销...
- 《数据挖掘导论》读书笔记(一) -27
- 软件工程 -- 状态转换图
- 【STM32】标准库 USART通信
- 交易猫跳转APP+后台管理
- codec和DSP的区别
- 6-5 计算天数[2] (15 分)
- 动态修改webservices地址 地址重载
- 成都爱尔樊映川:视网膜上视觉最敏锐部位,出问题怎么办
- 帮助中心在线制作工具推荐这4款,很不错哟!
热门文章
- GCPC 2013_A Boggle DFS+字典树 CSU 1457