poj 2001(trie)
2015-09-18 23:13
477 查看
题意:给一些单词,输出每个单词的一个前缀使这个前缀能唯一标识这个单词。
题解:先建字典树,用val[i]保存当前节点是多少个单词的前缀,然后再从头把每个单词放到字典树里查询,直到val[i]==1结束,表示到这里只能标识唯一单词,当前位置就是要输出的前缀的结尾位置。
题解:先建字典树,用val[i]保存当前节点是多少个单词的前缀,然后再从头把每个单词放到字典树里查询,直到val[i]==1结束,表示到这里只能标识唯一单词,当前位置就是要输出的前缀的结尾位置。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 40005; char str [30]; int ch [30], val ; int sz; void insert(char *s) { int u = 0, len = strlen(s); for (int i = 0; i < len; i++) { int k = s[i] - 'a'; if (!ch[u][k]) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = 1; ch[u][k] = sz++; } else val[ch[u][k]]++; u = ch[u][k]; } } void query(char *s) { int u = 0, len = strlen(s); for (int i = 0; i < len; i++) { int k = s[i] - 'a'; if (val[ch[u][k]] == 1) { if (i < len) printf("%c", s[i]); break; } else printf("%c", s[i]); u = ch[u][k]; } } int main() { int cnt = 0; sz = 1; memset(ch[0], 0, sizeof(ch[0])); while (scanf("%s", str[cnt]) == 1) { insert(str[cnt]); cnt++; } for (int i = 0; i < cnt; i++) { printf("%s ", str[i]); query(str[i]); printf("\n"); } return 0; }
相关文章推荐
- android 禁止listview 的ITEM被点击
- 华为面试题 输入一个n,在屏幕上输出N*N的矩阵
- sql Server分页查询
- java怎么建立JAVA工程项目?
- java怎么建立JAVA工程项目?
- 数组和集合拾遗
- golang一个深复制的库
- 第1章:关键字
- Objective-C之run loop详解
- 外网访问本机IP发布的项目解决方案
- java.lang.Exception: Socket bind failed: [730048]
- 玩不转
- 联想基于OpenStack的高可用企业云平台实践
- Win8.1打开CHM文件无法正常显示的解决办法
- HDOJ5438(图的各个连通分量遍历)
- 京东2016校园招聘笔试题
- NSZone不是个对象
- jQuery Ajax 实例 ($.ajax、$.post、$.get)
- 浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
- 典型的Top K算法