题目: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;
}


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

最新文章

  1. [译]初识.NET Core &amp; ASP.NET Core
  2. faster r-cnn 在CPU配置下训练自己的数据
  3. iOS开发,用了ARC,引入非ARC的第三方,报错
  4. BZOJ2121 字符串游戏
  5. 很不错的文章---【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群
  6. HTML基础总结&lt;段落&gt;
  7. 【PHP系列】PHP推荐标准之PSR-1,PSR-2
  8. 在IIS中部署Asp.net Mvc
  9. js三大家族offset,scroll,cliennt的区别
  10. Hive分区(静态分区+动态分区)
  11. php用PHPExcel库生成Excel文档的例子
  12. 重定向stdin stdout stderr |
  13. PHP 5 Array 函数
  14. 网络流24题 P1251 餐巾计划问题 拆点
  15. 解决PLSQL Developer 插入中文 乱码问题
  16. Oracle 12c client with .NET legacy Oracle driver
  17. smarty模板基础----缓存数据
  18. Executors创建线程池的几种方式以及使用
  19. CSS遮罩mask
  20. 用js来实现那些数据结构02(数组篇02-数组方法)

热门文章

  1. 【虚拟机】VMware-Ubuntu-安装与卸载
  2. 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
  3. Linux命令篇 - grep 命令
  4. 《计算机组成原理/CSAPP》网课总结(一)
  5. 『现学现忘』Git基础 — 23、Git中的撤销操作
  6. Python-100-Days-master
  7. Windows IDEA Community 报错
  8. Spring 源码(14)Spring Bean 的创建过程(5)
  9. 不可不知的 MySQL 升级利器及 5.7 升级到 8.0 的注意事项
  10. 138_Power BI&amp;Power Pivot特殊半累加度量