HDU-单词的前缀 字典树
2012-08-01 09:16
239 查看
要求输出每个单词在不产生歧义的情况下的最短前缀,直接构造出一颗字典树就可以了。先执行插入操作,对每一个单词经过的路径都进行一个自增的操作。再一次搜索每一个单词,当其遇到覆盖次数为一,或者是到了单词末尾就输出。
代码如下:
代码如下:
#include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int N, idx; char s[1005][25], rec[25]; struct Node { int cnt, ch[26]; }e[30000]; int init() { ++idx; memset(e+idx, 0, sizeof (e[0])); return idx; } void insert(int p, char *in) { if (*in != '\0') { if (e[p].ch[*in-'a'] == 0) { e[p].ch[*in-'a'] = init(); } ++e[ e[p].ch[*in-'a'] ].cnt; insert(e[p].ch[*in-'a'], in+1); } } void search(int p, char *in, int deep) { if (*in == 0 || e[p].cnt == 1) { rec[deep] = '\0'; } else { rec[deep] = *in; search(e[p].ch[*in-'a'], in+1, deep+1); } } int main() { int Root, ca = 0; while (scanf("%d", &N) == 1) { idx = 0; Root = init(); for (int i = 1; i <= N; ++i) { scanf("%s", s[i]); insert(Root, s[i]); } printf("***Case %d\n", ++ca); for (int i = 1; i <= N; ++i) { printf("%s ", s[i]); search(Root, s[i], 0); puts(rec); } } return 0; }
相关文章推荐
- hdu 1251 字典树模板题 ---多串 查找单词出现次数
- hdu Phone List 字典树的前缀判断
- HDU 1671-Phone List(字典树-前缀匹配)
- hdu 2072-单词数(字典树)
- hdu1251 字典树的应用(查询公共前缀)
- HDU 1251 统计难题(字典树(统计前缀数量) || map运用)
- HDU 1075 字典树 树搜索 逆路径输出单词
- HDU 1247 字典树 拆分单词
- hdu 2072 单词数 字典树
- hdu 2072 单词数 字典树
- hdu2072单词数 字典树做法
- HDU 1251 统计难题-字典树-统计前缀个数
- hdu 2072 单词数(字典树)
- hdu 1251 统计难题(给定字典单词,查询以某单词为前缀的单词的个数)
- hdu 2072 单词数(字典树入门题)
- 动态字典树_统计前缀子串(HDU_1251)
- HDU 1251 字典树 前缀计数
- 单词数 (HDU_2072) 字典树
- 利用字典树查找唯一标记某单词的最小前缀
- (HDU)2072 - 单词数【字典树】or【Set容器】