HDU 1671 字典树 查找前缀
2016-08-05 13:21
375 查看
题目链接
题意: 若干个电话号码 是否存在某个号码是另一个号码的前缀
将每一个号码都加入一颗字典树中
此时如果这个号码是某个号码的前缀或者某个号码是它的前缀
那么 第一种情况下此号码的节点在某个号码的路径上
第二种情况 在这个号码的路径上存在号码节点
题意: 若干个电话号码 是否存在某个号码是另一个号码的前缀
将每一个号码都加入一颗字典树中
此时如果这个号码是某个号码的前缀或者某个号码是它的前缀
那么 第一种情况下此号码的节点在某个号码的路径上
第二种情况 在这个号码的路径上存在号码节点
#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int maxnode = 100000 + 50; const int sigma_size = 15; int ch[maxnode][sigma_size]; int value[maxnode]; int get_idx(char x){ return x - '0'; } int sz; void init_Trie(){ sz = 0; memset(value,0,sizeof(value)); memset(ch[0],-1,sizeof(ch[0])); } bool Insert(char* num){ int n = strlen(num); int cur = 0; for(int i = 0;i < n;++i){ int idx = get_idx(num[i]); if(ch[cur][idx] == -1){ sz++; memset(ch[sz],-1,sizeof(ch[sz])); ch[cur][idx] = sz; } cur = ch[cur][idx]; if(value[cur]){ return false; } } value[cur] = 1; for(int i = 0;i < 10;++i){ if(ch[cur][i] != -1){ return false; } } return true; } char N[20]; int main(){ int T; scanf("%d",&T); while( T-- ){ init_Trie(); int n;scanf("%d",&n); bool right = true; for(int i = 0;i < n;++i){ scanf("%s",N); if(right){ right = right & Insert(N); } } printf("%s\n",right ? "YES" : "NO"); } return 0; }
相关文章推荐
- 【iOS】开发常用命令
- 在iOS开发过程中你遇到这个问题了么?
- EasyUI简单CRUD
- ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
- MongoDB 3.2.4 配置参考
- JavaWeb学习总结(使用Session防止表单重复提交)
- 【iOS】WebView加载HTML图片大小自适应与文章自动换行
- UITableView(一)----基本介绍
- Java为什么使用System.arraycopy来操作数组
- 解决svn: E170001
- 第三章:服务设计原则
- spring class.getClassLoader().getResource()和class.getResource()的不同
- 数据结构实验之链表二:逆序建立链表
- memcached数据库
- Linux上mysql修改密码的几种方法和mysql忘记密码的修改方式
- Jenkins与Docker相关的Plugin使用
- MySQL大表优化方案
- Android 用MediaCodec实现视频硬解码
- UE4蓝图比较合并
- Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)