题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1471

题目思路:

这不就是一个超级明显的字典树嘛

字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常。。。。。。

以单词 will,wet,colorful,colors举例做树

它从一个根节点开始(这边根节点统一为空,因为我们要存的是形形色色百十个字符串,强行做一个根节点显然不太合适)

根节点上分裂出一个字母,这个字母是某个单词的打头字母

第一个单词 will,它的打头字母是w,那么,根节点上出来一个w

紧接着,分裂出来的字母继续向下分裂,第二个字母,亦或者第n个字母就都出来了

那就形成了这样一个格局:根节点的一个孩子是 w,w 的一个孩子是 i,i 的一个孩子是 l,l 还有一个孩子 l 。

接着把下一个单词 wet 打进来,发现,打头字母全是 w

“那你总不可能把他们放在一起去吧!” “对啊” ”。。。。。。”

是的,在字典树里是有公共节点的可能的,而如果公共节点的的下一个节点还相同,那就还是公共的

自此,一个字典树就这么被建立起来了

等等,貌似能直接表示树的结构现在还没出生呢

针对这个,聪明的祖先们想到了用数组模拟的办法

  a b c d e f g h i j k l m n o p q r s t u v w x y z
0   7                                       1      
1         5       2                                  
2                       3                            
3                       4                            
4                                                    
5                                       6            
6                                                    
7                             8                      
8                       9                            
9                             10                      
10                                   11                
11           12                         15              
12                                         13          
13                       14                            
14                                                    

每一个行就是一层节点,这层节点向哪里分叉,是什么由纵列表示

不为零,就代表有东西,而这有了的东西又联系着下一个节点

妙哉妙哉

叨叨了这么久字典树,终于要回到正轨了

其实就是在字典树上加了两个判断

如果前面找的东西出来一个0,代表“路走斜了”,此时改变判断,告诉程序这里可能对不上

如果结尾处对上了,那就是短串与长串对上了,也要跟程序知会一声

但是,f1 和 f2 两个只要其中一个目标达成即可

如果是结尾对上了,那么上面必定对上,如果上面对不上它就不会回到结尾而是会另起一横行

如果上面对上了,结尾对不上,不排除先进短串后进长串的可能性,所以也是可以滴

综上,代码如下

#include<bits/stdc++.h>
using namespace std;
int len,root,tot,trie[1000000][10],f[100000];
int t,n,q,f1,f2;
string s;
//常规操作
int insert(){
len=s.size();
root=0;
for(int i=0;i<len;i++){//建树加判断
int id=s[i]-'0';//先把纵列搞出来
if(!trie[root][id]){//如果对不上了
trie[root][id]=++tot;//另起一行
f1=1;//知会一声
}
root=trie[root][id];//更新子节点
if(f[root]==1){//结尾能对上了
f2=1;//也要知会一声
}
}
f[root]=1;//为以后的“结尾能对上”铺路
return f1==0||f2==1;//两个条件达成一个即可
return 0;
}
int main(){
cin>>t;
while(t--){
cin>>n;
memset(trie,0,sizeof(trie));
memset(f,0,sizeof(f));
q=0;tot=0;
//记得归零
while(n--){
cin>>s;
f1=0;f2=0;
//记得归零
if(insert()==1){
q=1;
}
}
if(q==1){//满足要求了
cout<<"NO"<<endl;
//按他的想法输出
}
else{//不满足
cout<<"YES"<<endl;
//也要按照它的想法输出
//这题的NO和YES反过来了
//大家注意一下
}
}
return 0;
}


题目总结:背熟字典树模板
还有就是后面的“两个条件达成一个即可”要捋清楚

018(Phone List)(字典树)的更多相关文章

  1. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  2. [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  3. 字典树+博弈 CF 455B A Lot of Games(接龙游戏)

    题目链接 题意: A和B轮流在建造一个字,每次添加一个字符,要求是给定的n个串的某一个的前缀,不能添加字符的人输掉游戏,输掉的人先手下一轮的游戏.问A先手,经过k轮游戏,最后胜利的人是谁. 思路: 很 ...

  4. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  5. 山东第一届省赛1001 Phone Number(字典树)

    Phone Number Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 We know that if a phone numb ...

  6. 字典树 - A Poet Computer

    The ACM team is working on an AI project called (Eih Eye Three) that allows computers to write poems ...

  7. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  8. HDU1671 字典树

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. *HDU1251 字典树

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

随机推荐

  1. Dockerfile 命令详解及最佳实践

    Dockerfile 命令详解 FROM 指定基础镜像(必选) 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制.就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指 ...

  2. 事务的隔离级别与MVCC

    提到数据库,你多半会联想到事务,进而还可能想起曾经背得滚瓜乱熟的ACID,不知道你有没有想过这个问题,事务有原子性.隔离性.一致性和持久性四大特性,为什么偏偏给隔离性设置了级别? 一切还得从事务说起. ...

  3. Odoo 服务器搭建备忘

    前提 OS:Ubuntu 20.04LTS Odoo:14旗舰版 数据库:Postgres13.0 *数据库和Odoo安装在一台服务器 系统设置 为了Log日志时间好看,进行系统时区设置 # 查看可用 ...

  4. STS快捷键

    在类或者方法上方加注释:shift+alt+J

  5. 变量命名 函数命名 方法 Naming cheatsheet

    Naming things is hard. This sheet attempts to make it easier. Although these suggestions can be appl ...

  6. ChCore Lab1 机器启动 实验笔记

    本文为上海交大 ipads 研究所陈海波老师等人所著的<现代操作系统:原理与实现>的课程实验(LAB)的学习笔记的第一篇. 书籍官网:现代操作系统:原理与实现,里面有实验的参考指南和代码仓 ...

  7. 简单的TRPG骰子

    又到了新一年的带团季了,今年准备用电脑来存放各种资料,自然也是需要一个简单的骰子工具了,反正也不复杂,就自己写了个,放着做个备份吧 主要功能是计算x1dy1+/-x2dy2+/-.....+/-con ...

  8. Linux进程总结

    一个执着于技术的公众号 进程 进程,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.它的执行需要系统分配资源创建实体之后,才能进行.举个例子: ...

  9. 为 ASP.NET Core (6.0)服务应用添加ApiKey验证支持

    这个代码段演示了如何为一个ASP.NET Core项目中添加Apikey验证支持. 首先,通过下面的代码创建项目 dotnet new webapi -minimal -o yourwebapi 然后 ...

  10. uniapp封装request方法及调用

    export default { doRequest(method, url, data) { // 如果data为空 if (!data) var data = [] var arr = [] ar ...