字典树模板

来源:互联网 发布:打车软件营销方案 编辑:程序博客网 时间:2024/06/15 12:26
#include<iostream>#include<algorithm>#include<string.h>using namespace std;typedef struct Trie_node {int count;//统计单词前缀出现的次数struct Trie_node*next[26];//指向各个子树的指针bool exist;//标记该结点处是否构成单词}TrieNode,*Trie;TrieNode* creteTrieNode(){TrieNode *node = new TrieNode;node->count = 0;node->exist = false;memset(node->next, NULL, sizeof(node->next));return node;}void Trie_insert(Trie root, char *word){Trie node = root;char *p = word;int id;while (*p){id = *p - 'a';if (node->next[id] == NULL) {node->next[id] = creteTrieNode();}node = node->next[id];//每插入一步,指针向下移动一位p++;node->count++;//统计每个单词前缀出现的次数}node->exist = true;//单词结束的地方标记此处可以构成一个单词}int Trie_search(Trie root, char *word){Trie node = root;char *p = word;int id;while (*p){id = *p - 'a';node = node->next[id];p++;if (node == NULL)return 0;}return node->count;}int main(void){Trie root = creteTrieNode();char str[12];//bool flag = false;int n, m;cin >> n;getchar();while (n--)  //gets_s(str){gets_s(str);Trie_insert(root, str);/*if (flag)cout << Trie_search(root, str) << endl;else {if (strlen(str) != 0)Trie_insert(root, str);else flag = true;}*/}cin >> m; getchar();while (m--){gets_s(str);cout << Trie_search(root, str) << endl;}return 0;}

原创粉丝点击