Week15—字典树应用,字符串包含问题
问题描述
ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了。只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM。
Q老师 给了 ZJM 一些仅有 01 组成的二进制编码串, 他问 ZJM:是否存在一个串是另一个串的前缀.
【输入】
多组数据。每组数据中包含多个仅有01组成的字符串,以一个9作为该组数据结束的标志。
【输出】
对于第 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
问题分析
字典树基本知识
查询集合T中是否存在一个字符串是S的前缀,用构建完的字典树匹配字符串S。
一个字符串和一个字符串集合匹配,因此考虑使用字典树
做法:
- 往字典树中依次插入每个字符串,假设当前字符串为 S
- 有两种情况需要判断,S 是否为之前某个字符串的前缀,之前是否有某个字符串是 S 的前缀
- 往字典树中依次插入每个字符串,假设当前字符串为 S,判断:【1】S 是否为之前某个字符串的前缀,当字符串 S 插入结束后,其最后一个节点是字典树中已经存在的节点,则说明 S 为之前某个字符串的前缀【2】之前是否有某个字符串是 S 的前缀,在字符串 S 插入过程中,如果遇到某一个字典树中的节点为某一个字符串的结尾,则说明存在某个字符串是 S 的前缀
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;struct Tire
{//N表示字典数最多的节点个数,charset表示字符种类数//tot表示节点编号,root表示根节点编号//child[now][x]表示节点now的第x个儿子//flag[now]=1表示节点now是某一个字符串的结尾 static const int N=1010,charset=30;int tot,root,child[N][charset],flag[N];Tire(){memset(child,-1,sizeof child);root=tot=0;}void clear(){memset(child,-1,sizeof child);root=tot=0;}int insert(char *str){//在字典树中插入字符串str int now=root,jud=0,len=strlen(str);for(int i=0;i<len;i++){int x=str[i]-'0';if(child[now][x]==-1){child[now][x]=++tot;flag[now]=0;}else if(i==len-1||flag[child[now][x]]) jud=1;//i==len-1且child[now][x]!=-1说明S是之前某个字符串的前缀//flag[child[now][x]]==1说明之前某个字符串是S的前缀 now=child[now][x];}flag[now]=1;//标记该节点为字符的结尾return jud; }bool query(char *str){//查询字典树中是否存在某个完整字符串是str的前缀 int now=root; for(int i=0;str[i];i++){int x=str[i]-'0';if(child[now][x]==-1)return false;if(flag[now]) return true; now=child[now][x];} return false;}
};int main()
{char str[30];Tire T;int k=1,flag=0;while(cin>>str){if(str[0]=='9'){T.clear();if(flag==1) cout<<"Set "<<k<<" is not immediately decodable"<<endl;else cout<<"Set "<<k<<" is immediately decodable"<<endl;flag=0;k++;continue;} else {int p=T.insert(str);//数组名相当于指针名 if(p==1) flag=1;}}
}
Week15—字典树应用,字符串包含问题相关推荐
- 字典树实现_【Leetcode每日打卡】单词的压缩编码 Trie(字典树)入门
一.前言(鸡汤(一段废..话..可以跳过啦)) 同学们好!没想到我这个小小的公众号破千粉啦,对于大佬们而言或许不值一提,但是对我而言是一个莫大的鼓舞!更加坚定了我持续输出优质内容的决心.希望我们都能每 ...
- 数据结构与算法(十一)Trie字典树
本文主要包括以下内容: Trie字典树的基本概念 Trie字典树的基本操作 插入 查找 前缀查询 删除 基于链表的Trie字典树 基于Trie的Set性能对比 LeetCode相关线段树的问题 Lee ...
- 一个字典树问题--电话号码转化问题(POJ 1002 487-3279)
字典树,又称为单词查找树,Trie树.是一种用于快速检索多叉树的结构.典型应用于统计,排序和保存大量字符串.利用字符串的前缀来减少存储空间,减少无谓的比较,提高查询效率. 字典树根节点不包含任何数据, ...
- 【CODE】Unique Paths Word Search (DFS dp 字典树)
目录 62. Unique Paths 63. Unique Paths II 980. Unique Paths III 79. Word Search 212. Word Search II 字典 ...
- 字典树andXOR*
A.HDU 4825 你需要写一种数据结构: 往其中加入一个正整数: 找出一个正整数,使得该数与询问数的异或结果最大. \(n\le 10^5\) . 解 将数按二进制从高位到低位插入字典树. 查询时 ...
- CodeForces - 1476E Pattern Matching(字典树+拓扑)
题目链接:点击查看 题目大意:给出 nnn 个模式串和 mmm 个匹配串,题目要求输出一种模式串的排列方式,使得 mmm 个模式串从头开始匹配的话,可以匹配到相应的模式串 模式串的长度不超过 444, ...
- 字典树简单实现 插入 查找 遍历
字典树是一种存储字符串的高效的结构,它保存了不同字符的相同前缀,又因此叫做前缀树,使用前缀,大大避免相同字符的重复匹配,加快查找效率 字典树是一颗多叉树,比如存储26个字母的,那么就有26叉 字典树的 ...
- 字典树应用(1)字典树简介
字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 字典树 – 应用 字符串 ...
- 字符串处理——字典树
[概述] 字典树,又称为单词查找树,Tire 树,是一种树形结构,它是哈希树的变种. 字典树与字典很相似,当要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典 ...
最新文章
- Self-Attention 加速方法一览:ISSA、CCNet、CGNL、Linformer
- DateGridView的外观美化
- 美议员提议:总统发微博后即使删除也要记录档案
- poj 1329(求三角形外接圆)
- 学校的体育设施预订服务系统
- MySQL分组函数的使用特点
- java 基础知识部分提炼
- CentOS7 Linux服务器修改SSH默认22端口
- Halcon 抓圆工具spoke
- 肤色检测一例-使用rgb颜色模型
- ubuntu 更改文件夹拥有者和权限
- linux windows市场占有率,Windows 10市场份额罕见倒退:Win7也跌了 Linux暴增111%
- 何凯明———去雾算法论文阅读记录
- Arduino 常用电子元件和扩展模块
- 特斯拉神器-TeslaMate
- 《工作五年,决定你一生的财富》读后感
- Origin 数据渐变色
- android高仿朋友圈,高仿微信朋友圈图片展示效果 ImageWatcher
- [题目解析]乐乐的数字
- FreeBie—免费设计师专用素材网
热门文章
- 关于笔记本电脑触摸板失灵的解决办法
- 两分钟内教会你如何给视频加配音,快速掌握配音技巧!
- 图片上传被旋转,golang Exif 判断.jepg图片原始信息Orientation方向,并旋转,
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解
- python infor_学习Python第7天-列出函数,列表,infor
- 9年研发经验,扫地盲僧带你看2022年前端未来发展趋势
- 班级管理系统c语言学号姓名,c++学生成绩管理系统1、问题描述 学生信息包括:学号、姓名、性别、年龄、班级等信息。 小学生...
- 久闻大名的Fragment
- MLNLP顶会论文发表总榜:谷歌最狂,清北入前十,周明、张岳、刘挺华人前三
- unity 手机游戏优化(场景篇)