题目: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. python基础-基本数据类型(三)

    一.散列类型 散列类型用来表示无序的集合类型 1.集合(set) Python中的集合与数学符号中的集合类似,都是用来表示无序不重复元素的集合. 1.1 集合的定义 集合使用一对{}来进行定义,集合中 ...

  2. C# iText 7 切分PDF,处理PDF页面大小

    一.itext 我要使用itext做一个pdf的页面大小一致性处理,然后再根据数据切分出需要的pdf. iText的官网有关于它的介绍,https://itextpdf.com/ 然后在官网可以查找a ...

  3. MeteoInfo-Java解析与绘图教程(八)_java解析卫星FY-4A一级产品文件(HDF举例)

    MeteoInfo-Java解析与绘图教程(八)_java解析卫星一级产品文件(HDF举例) 最近解析卫星数据遇到了一级产品,它的解析方式与之前文章说的有些不同,特此补充一下 卫星的一级产品,里面是没 ...

  4. ceph日常运维管理

    点击关注上方"开源Linux", 后台回复"读书",有我为您特别筛选书籍资料~ 相关阅读: ceph分布式存储简介 常见问题 nearfull osd(s) o ...

  5. S3C2410——LED灯实验

    一.S3C2410输入/输出的原理 Linux主要有字符设备.块设备和网络设备3类驱动程序,我们一般编写的驱动都是字符设备驱动程序. 二.程序部分 编写程序控制3个LED灯,代码分为2个部分:控制LE ...

  6. 2. 假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实 际数据。

    假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实  际数据.编写程序,完成下 ...

  7. Linux磁盘和文件系统知识总结

    硬盘操作 为什么要给硬盘分区? 如果你需要在一块硬盘上用到多个文件系统,那么你就需要对硬盘进行分区,以便用不同的分区支持不同的文件系统.(但一个硬盘只能有一个分区表!)反过来说,如果你整块硬盘都用同样 ...

  8. 无线:WEP

    WEP是Wired Equivalent Privacy的简称,有线等效保密(WEP)协议是对在两台设备间无线传输的数据进行加密的方式,用以防止非法用户窃听或侵入无线网络.不过密码分析学家已经找出 W ...

  9. 万字长文,带你轻松学习 Spark

    大家好,我是大D. 今天给大家分享一篇 Spark 核心知识点的梳理,对知识点的讲解秉承着能用图解的就不照本宣科地陈述,力求精简.通俗易懂.希望能为新手的入门学习扫清障碍,从基础概念入手.再到原理深入 ...

  10. Es图形化软件使用之ElasticSearch-head、Kibana,Elasticsearch之-倒排索引操作、映射管理、文档增删改查

    今日内容概要 ElasticSearch之-ElasticSearch-head ElasticSearch之-安装Kibana Elasticsearch之-倒排索引 Elasticsearch之- ...