问题描述

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。
一个字符串和一个字符串集合匹配,因此考虑使用字典树
做法:

  1. 往字典树中依次插入每个字符串,假设当前字符串为 S
  2. 有两种情况需要判断,S 是否为之前某个字符串的前缀,之前是否有某个字符串是 S 的前缀
  3. 往字典树中依次插入每个字符串,假设当前字符串为 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—字典树应用,字符串包含问题相关推荐

  1. 字典树实现_【Leetcode每日打卡】单词的压缩编码 Trie(字典树)入门

    一.前言(鸡汤(一段废..话..可以跳过啦)) 同学们好!没想到我这个小小的公众号破千粉啦,对于大佬们而言或许不值一提,但是对我而言是一个莫大的鼓舞!更加坚定了我持续输出优质内容的决心.希望我们都能每 ...

  2. 数据结构与算法(十一)Trie字典树

    本文主要包括以下内容: Trie字典树的基本概念 Trie字典树的基本操作 插入 查找 前缀查询 删除 基于链表的Trie字典树 基于Trie的Set性能对比 LeetCode相关线段树的问题 Lee ...

  3. 一个字典树问题--电话号码转化问题(POJ 1002 487-3279)

    字典树,又称为单词查找树,Trie树.是一种用于快速检索多叉树的结构.典型应用于统计,排序和保存大量字符串.利用字符串的前缀来减少存储空间,减少无谓的比较,提高查询效率. 字典树根节点不包含任何数据, ...

  4. 【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 字典 ...

  5. 字典树andXOR*

    A.HDU 4825 你需要写一种数据结构: 往其中加入一个正整数: 找出一个正整数,使得该数与询问数的异或结果最大. \(n\le 10^5\) . 解 将数按二进制从高位到低位插入字典树. 查询时 ...

  6. CodeForces - 1476E Pattern Matching(字典树+拓扑)

    题目链接:点击查看 题目大意:给出 nnn 个模式串和 mmm 个匹配串,题目要求输出一种模式串的排列方式,使得 mmm 个模式串从头开始匹配的话,可以匹配到相应的模式串 模式串的长度不超过 444, ...

  7. 字典树简单实现 插入 查找 遍历

    字典树是一种存储字符串的高效的结构,它保存了不同字符的相同前缀,又因此叫做前缀树,使用前缀,大大避免相同字符的重复匹配,加快查找效率 字典树是一颗多叉树,比如存储26个字母的,那么就有26叉 字典树的 ...

  8. 字典树应用(1)字典树简介

    字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 字典树 – 应用 字符串 ...

  9. 字符串处理——字典树

    [概述] 字典树,又称为单词查找树,Tire 树,是一种树形结构,它是哈希树的变种. 字典树与字典很相似,当要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典 ...

最新文章

  1. Self-Attention 加速方法一览:ISSA、CCNet、CGNL、Linformer
  2. DateGridView的外观美化
  3. 美议员提议:总统发微博后即使删除也要记录档案
  4. poj 1329(求三角形外接圆)
  5. 学校的体育设施预订服务系统
  6. MySQL分组函数的使用特点
  7. java 基础知识部分提炼
  8. CentOS7 Linux服务器修改SSH默认22端口
  9. Halcon 抓圆工具spoke
  10. 肤色检测一例-使用rgb颜色模型
  11. ubuntu 更改文件夹拥有者和权限
  12. linux windows市场占有率,Windows 10市场份额罕见倒退:Win7也跌了 Linux暴增111%
  13. 何凯明———去雾算法论文阅读记录
  14. Arduino 常用电子元件和扩展模块
  15. 特斯拉神器-TeslaMate
  16. 《工作五年,决定你一生的财富》读后感
  17. Origin 数据渐变色
  18. android高仿朋友圈,高仿微信朋友圈图片展示效果 ImageWatcher
  19. [题目解析]乐乐的数字
  20. FreeBie—免费设计师专用素材网

热门文章

  1. 关于笔记本电脑触摸板失灵的解决办法
  2. 两分钟内教会你如何给视频加配音,快速掌握配音技巧!
  3. 图片上传被旋转,golang Exif 判断.jepg图片原始信息Orientation方向,并旋转,
  4. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解
  5. python infor_学习Python第7天-列出函数,列表,infor
  6. 9年研发经验,扫地盲僧带你看2022年前端未来发展趋势
  7. 班级管理系统c语言学号姓名,c++学生成绩管理系统1、问题描述 学生信息包括:学号、姓名、性别、年龄、班级等信息。 小学生...
  8. 久闻大名的Fragment
  9. MLNLP顶会论文发表总榜:谷歌最狂,清北入前十,周明、张岳、刘挺华人前三
  10. unity 手机游戏优化(场景篇)