POJ3630-Phone List-(字典树)
一直没有学字典树,听起来很唬人,闲来无事找一道入门题做做。
字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
它有3个基本性质:
根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。
搜索字典项目的方法为:
(1) 从根结点开始一次搜索;
(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;
(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。
(4) 迭代过程……
(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。
用一张图表示会比较直观,至于实现过程就是编码能力的问题了。

http://poj.org/problem?id=3630
题意:给出好多不超过10位的电话号码,如果存在某一个电话号码(如911)是其他电话号码(91110086)的前缀就会导致后者无法拨通,问是否全部电话号码都能拨通。
思路:开一个tree[maxx][10]数组模拟树的节点搜寻,也就是用数组解决指针指向问题,第二维度的下标是0-9这10个数字,存储的内容是下一次跳向的行数rt。对于当前数字x,通过tree[rt][x]判断是否存在或者重新标记。并使用一个num数组来标记一个电话号码的终点,判断是不是其他电话号码的前缀。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define inf 0x3f3f3f3f
const double pi=3.1415926;
using namespace std; int t,n;
int tree[][];
int num[];
int cnt;
bool flag=true; void my_insert(string s)
{
int rt=;///当前节点,最后变成字典树的叶子节点
int len=s.size();
for(int i=;i<len;i++)
{
int x=s[i]-'';///用数字表示就不用一直写引号
if(tree[rt][x]==)
tree[rt][x]=cnt++;///cnt是全局累计变量,下一行又作为rt,所以tree数组的行至少要开到n*10
rt=tree[rt][x];
if(num[rt])///判断到当前位时,是否存在前缀的电话号码,因为每到一个叶子节点就会用num数组标记
flag=false;
}
num[rt]=;
for(int i=;i<;i++)///判断当前字符串是不是别人的前缀
{
if(tree[rt][i])
{
flag=false;
break;
}
}
} int main()///poj3630
{
cin>>t;
while(t--)
{
memset(tree,,sizeof(tree));
memset(num,,sizeof(num));
cnt=;
flag=true;
cin>>n;
string s;
for(int i=;i<=n;i++)
{
cin>>s;///对于每个电话号码插入到字典树之中
if(flag) ///如果还没有判断出公共前缀才插入,减少时间
my_insert(s);
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return ;
}
例如插入第一个911654的电话号码,tree数组变动情况如下,横竖下标范围都是0-9

再插入一个911,整个tree数组不变,通过查找历史前缀可以找到
再插入一个110,数组变成

参考:https://blog.csdn.net/qq_41879343/article/details/102501946
POJ3630-Phone List-(字典树)的更多相关文章
- poj3630||hdoj1671(字典树)
题目链接:https://vjudge.net/problem/HDU-1671 题意:给定n个字符串,判断是否存在一些字符串是另一些字符串的前缀. 思路: 套模板,存在前缀可能是两种情况: 当前字符 ...
- POJ3630/HDU-1671 Phone List,字典树静态建树!
Phone List POJ动态建树TLE了~~~ 题意:拨打某个电话时可能会因为和其他电话号码的前几位重复而导致错误,现在给出一张电话单,求是否有某个电话是其他电话的前缀.是则输出NO,否则输出YE ...
- Phone List POJ-3630 字典树 or 暴力
Phone List POJ-3630 字典树 or 暴力 题意 目前有 t 组数据, n 个电话号码,如果拨打号码的时候 先拨通了某个号码,那么这一串号码就无法全部拨通. 举个例子 911 和 91 ...
- hdu杭电1671 / poj3630 字典树
传送门 题意:输入n串数字 找出是否有存在串的前缀与另一个串相同 如果存在 输出NO否则输出YES 思路:用字典树解决 标记字典树总串的结尾 查找出一个串内部是否有被标记的节点 如果有那么说明存在前缀 ...
- 字典树trie的学习与练习题
博客详解: http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html http://eriol.iteye.com/bl ...
- Tire树(字典树)
from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...
- 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...
- [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)
Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...
- 字典树+博弈 CF 455B A Lot of Games(接龙游戏)
题目链接 题意: A和B轮流在建造一个字,每次添加一个字符,要求是给定的n个串的某一个的前缀,不能添加字符的人输掉游戏,输掉的人先手下一轮的游戏.问A先手,经过k轮游戏,最后胜利的人是谁. 思路: 很 ...
随机推荐
- 【ECNU3542】神奇的魔术(二分交互题)
点此看题面 大致题意: 有一个\(1\sim 2^n\)的排列,\(n\le7\),每次交互告诉你有几个位置上的数是正确的,让你在\(1000\)轮以内猜出每个位置上的数. 二分 显然,我们可以通过二 ...
- MySQL实战45讲学习笔记:第四十五讲
一.本节概述 MySQL 里有很多自增的 id,每个自增 id 都是定义了初始值,然后不停地往上加步长.虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限.比如,无符 ...
- Note | 期刊答复(response)
第一次TPAMI回复整理的经验. 190926:TPAMI中了,特回来补充. 简洁 尤其对于问答型问题,一定要在前三句话就回答审稿人的问题:yes or no. 不要绕弯子,专注于审稿人问题,解决就行 ...
- 再谈Token认证,如何快速方便获取用户信息
前面我写了一篇<Token认证,如何快速方便获取用户信息>的文章,引起了各位读者的积极参与,除了文章中我提出的三种方式,各位读者大佬们也贡献了其他多种实现方式. 今天决定基于大家提供的思路 ...
- linux内核参数sysctl.conf,TCP握手ack,洪水攻击syn,超时关闭wait
题记:优化Linux内核sysctl.conf参数来提高服务器并发处理能力 PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题.要提 ...
- python操作时间
一.问题背景 在对数据进行操作的时候我们总是会遇到数据类型是date类型的数据,这种数据会让我们在使用和操作的过程中遇到一些问题,比如int类型和date类型不对等,string类型和date类型不对 ...
- OpenGL入门1.1:窗口
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 测试GLFW 在我们的test.cpp中加入下面两个头文件 #include <glad/glad.h> #inclu ...
- C# 方法默认访问级别 : private C# 类默认访问级别 : internal
C# 方法默认访问级别 : private C# 类默认访问级别 : internalpublic:访问不受限制.protected:访问仅限于包含类或从包含类派生的类型.Internal:访问仅限于 ...
- 纯C语言实现顺序栈
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int SElemType; typede ...
- 智能家居-3.基于esp8266的语音控制系统(软件篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...