hihoCoder 1014 Trie树 字典树模板
2017-05-31 20:28
369 查看
题目:
http://hihocoder.com/problemset/problem/1014题意:
首先给出一些字符串,代表字典里的单词。然后再给出一些字符串,询问字典中以当前字符串为前缀的单词个数思路:
字典树模板题。留个模板动态字典树,特点是好写好理解,确定是效率慢,有可能TLE
//多实例记得调用trie_del函数清空字典树,单实例无所谓 #include <bits/stdc++.h> using namespace std; const int N = 100000 + 10, INF = 0x3f3f3f3f; struct trie { int val; trie *next[26]; trie() { val = 0; memset(next, 0, sizeof next); } }*root; void trie_insert(char *s) { trie *p = root; for(int i = 0; s[i]; i++) { int j = s[i] - 'a'; if(p->next[j] == NULL) p->next[j] = new trie; p->next[j]->val++; p = p->next[j]; } } int trie_query(char *s) { trie *p = root; for(int i = 0; s[i]; i++) { int j = s[i] - 'a'; if(p->next[j] == NULL) return 0; p = p->next[j]; } return p->val; } void trie_del(trie *p) { for(int i = 0; i < 26; i++) if(p->next[i] != NULL) trie_del(p->next[i]); delete p; } int main() { int n, m; root = new trie; char s[20]; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%s", s); trie_insert(s); } scanf("%d", &m); for(int i = 1; i <= m; i++) { scanf("%s", s); printf("%d\n", trie_query(s)); } trie_del(root); return 0; }
静态字典树,特点是速度快,但需要的空间稍大,小心空间开小导致的RE
//这个模板长的很像动态字典树 #include <bits/stdc++.h> using namespace std; const int N = 100000 + 10; struct node { int val; node *next[26]; }trie[N*10], *root; int tot; char s ; node* node_init() { trie[tot].val = 0; memset(trie[tot].next, 0, sizeof trie[tot].next); return trie + tot++; } void trie_insert(char *s) { node *p = root; for(int i = 0; s[i]; i++) { int j = s[i] - 'a'; if(p->next[j] == NULL) p->next[j] = node_init(); p->next[j]->val++; p = p->next[j]; } } int trie_query(char *s) { node *p = root; for(int i = 0; s[i]; i++) { int j = s[i] - 'a'; if(p->next[j] == NULL) return 0; p = p->next[j]; } return p->val; } int main() { int n, m; tot = 1; root = trie + 0; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%s", s); trie_insert(s); } scanf("%d", &m); for(int i = 1; i <= m; i++) { scanf("%s", s); printf("%d\n", trie_query(s)); } return 0; }
//多实例清空字典树时将sz初始化为1即可 #include <bits/stdc++.h> using namespace std; const int N = 100000 + 10, INF = 0x3f3f3f3f; struct node { int val; int next[26]; }trie[N*5]; int sz; int node_init() { memset(trie[sz].next, 0, sizeof trie[sz].next); trie[sz].val = 0; return sz++; } void trie_insert(char *s) { int id = 0; for(int i = 0; s[i]; i++) { int j = s[i] - 'a'; if(trie[id].next[j] == 0) trie[id].next[j] = node_init(); trie[trie[id].next[j]].val++; id = trie[id].next[j]; } } int trie_query(char *s) { int id = 0; for(int i = 0; s[i]; i++) { int j = s[i] - 'a'; if(trie[id].next[j] == 0) return 0; id = trie[id].next[j]; } return trie[id].val; } int main() { int n, m; char s[20]; sz = 1; memset(trie[0].next, 0, trie[0].next); scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%s", s); trie_insert(s); } scanf("%d", &m); for(int i = 1; i <= m; i++) { scanf("%s", s); printf("%d\n", trie_query(s)); } return 0; }
相关文章推荐
- Hihocoder 1014Trie树(字典树模板)
- c++字典树 Trie树(hihocoder1014)
- hihocoder 1014 Trie树 (Trie 记模板 数组+指针)
- hihocoder 1014 Trie树 字典树模版题
- hihoCoder 1014 Trie树(字典树)
- hihoCoder - 1014 : Trie树 - (字典树)
- hihoCoder 1014 Trie树(字典树入门)
- hihocoder_1014: Trie树(Trie树模板题)
- hihocoder 1014: Trie树(Trie树模板题)
- hihoCoder - 1014 - Trie树 (简单字典树!!)
- hihocoder 1014 Trie树 字典树
- hihoCoder 1014 : Trie树(字典树)
- hihoCoder-1014-Trie树(字典树)
- hihoCoder 1014 : Trie树(字典树)
- hihoCoder 1014trie树(字典树)
- hihoCoder 1014 Trie树(字典树)
- hihoCoder 1014 Trie树(基础字典树)
- hihoCoder 1014 Trie树
- 1014 : Trie树 hihocoder
- C++——字典树(Trie树)模板——统计难题(HDU1251)