链接:http://blog.csdn.net/acvay/article/details/47089657

题意  给你一组电话号码  判断其中是否有某个电话是另一个电话的前缀

字典树的基础应用  可以先把所有电话存进Trie  标记每个电话的结束字符  然后再查询每个号码  看中途是否有结束标记  有的话就说明有号码是这个号码的前缀了

实际上  插入完成就能知道是否有号码是另一个号码的前缀了  假设A是B的前缀

若A在B之前插入  那么插入B的时候会遇到A的结束标记

弱A在B之后插入  那么A插入完成之后的结点还有非空的孩子结点

这样就只用在每次插入时判断就行了  可以省掉查询这一步

指针和动态内存分配实现字典更容易些  但在有多组样例的时侯不释放内存会导致MLE  释放内存又要多花费不必要的时间  可能导致TLE  所以用数组实现比较好

#include<cstdio>
#include<cstring>
using namespace std;
const int N = ;
char tel[N][];
int trie[N * ][], L;
bool end[N * ], flag;
void initTrie() {
L = ;
memset(trie, , sizeof(trie));
memset(end, , sizeof(end));
}
void _insert(char *s) {
int r = , i = , j;
while (s[i]) {
if (end[r]) flag = false;
j = s[i++] - '';
if (!trie[r][j])
trie[r][j] = L++;
r = trie[r][j];
}
for (int i = ; i < ; i++) {
if (trie[r][i]) flag = ;
end[r] = ;
}
}
int main() {
int T, n;
scanf("%d", &T);
while (T--) {
initTrie();
scanf("%d", &n);
flag = true;
for (int i = ; i < n; ++i) {
scanf("%s", tel[i]);
_insert(tel[i]);
}
puts(flag ? "YES" : "NO");
}
return ;
}

最新文章

  1. Android界面性能调优手册
  2. IntelliSense: 应输入声明的解决方案
  3. winrar在右键菜单上加上:打包自动加上日期时间标签【图文教程】 - imsoft.cnblogs
  4. dialog组件
  5. C#_ajax_demo
  6. Spring 3.x企业应用开发实战(9-1)----依赖注入
  7. 不在界面上用控件 动态创建idhttp,IdAntiFreeze来用
  8. css基础之 id和选择器
  9. 【拓扑排序】【HDU3231】【Box Relations】
  10. u3d之世界坐标系,屏幕坐标系,视口坐标系,如何获取物体距离摄像机的距离
  11. Linux从入门到放弃(为做一个开发+运维的全能性人才而奋斗)
  12. unity 中UGUI制作滚动条视图效果(按钮)
  13. void的几点用法
  14. 死磕nginx系列--nginx 目录
  15. Linux基础命令---service
  16. 《信息安全技术》实验二 Windows口令破解
  17. [朴孝敏][Sketch]
  18. macOS how to install python3
  19. Woody的Python学习笔记3
  20. Sublime text3!行首,行尾,批量编辑!

热门文章

  1. jsonp跨域js
  2. POI导入
  3. .bss 段 block started symbol
  4. CUDA编程
  5. 网络-CIDR地址分类介绍
  6. ORA-01089 数据库无法正常关闭
  7. MARKDOWN--介绍http://www.jianshu.com/p/q81RER
  8. 如何用Transformer+从PDF文档编辑数据
  9. unity, 查看build版log文件
  10. php curl详细说明