基本上是标准的寻找前缀的问题,只需要insert和search函数就可以了。
我这里主要是修改一下n的记录方法,这里的n代表的不是叶子节点的标志,而是有多少单词经过了这条路径的标志。
然后是查找需要查找的前缀单词,如果没有找到,就返回0,表示没有单词以这个前缀单词为前缀,如果找到,直接返回n就是答案了。因为有n个单词经过了这条路径。
查找效率是常数。
使用静态分配空间的办法。
#include <stdio.h> #include <string.h> const int MAX_N = 500000; const int ARR_SIZE = 26; const int MAX_WORD = 11; struct Node { int n; Node *arr[ARR_SIZE]; }; Node pool[MAX_N]; int poolId; void clearNode(Node *p) { p->n = 0; for (int i = 0; i < ARR_SIZE; i++) { p->arr[i] = NULL; } } void insert(Node *trie, char w[]) { int len = strlen(w); for (int i = 0; i < len; i++) { int j = w[i] - 'a'; if (trie->arr[j] == NULL) { trie->arr[j] = &pool[poolId++]; clearNode(trie->arr[j]); } trie = trie->arr[j]; trie->n++; //修改成可以快速查找前缀 } } int searchPre(Node *trie, char w[]) { int len = strlen(w); for (int i = 0; i < len; i++) { int j = w[i] - 'a'; if (!trie->arr[j]) return 0; trie = trie->arr[j]; } return trie->n; } int main() { Node *trie = &pool[0]; clearNode(trie); poolId = 1; char word[MAX_WORD]; while (gets(word) && word[0] != '\0') { insert(trie, word); } while (gets(word)) { printf("%d\n", searchPre(trie, word)); } return 0; }
HDU 1251 统计难题 Trie题解,布布扣,bubuko.com
原文地址:http://blog.csdn.net/kenden23/article/details/38373835