字典树模板
本文最后更新于:3 years ago
模板来源:HKer_YM的博客
1.指针建树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| struct node { node* child[MAXN]; int flag; node() { memset(child, NULL, sizeof(child)); flag = 1; } };
void insert(char *str, node* root) { int len = strlen(str); node* tmp = root, *q; for(int i = 0; i <len; i++) { int id = str[i] - 'a'; if(tmp->child[id] == NULL) { q = new node(); tmp->child[id] = q; tmp = tmp->child[id]; } else { tmp = tmp->child[id]; ++(tmp->flag); } } } int query(char *str, node* root) { int len = strlen(str); node* tmp = root; for(int i = 0; i < len; i++) { int id = str[i] - 'a'; tmp = tmp->child[id]; if(tmp == NULL) return 0; } return tmp->flag; }
|
2.数组建树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void insert(int val) { int len = strlen(s); int rt = root; for(int i = 0; i < len; i++) { int id = s[i] - 'a'; if(tree[rt][id] == 0) { tree[rt][id] = ++cnt; } rt = tree[rt][id]; } ans[rt] = val; } int query() { int len = strlen(s); int rt = root; for(int i = 0; i < len; i++) { int id = s[i] - 'a'; if(tree[rt][id] == 0) return -1; rt = tree[rt][id]; } return (ans[rt] == 0 ? -1 : ans[rt]); }
|