tire树

来源:互联网 发布:有java基础学python 编辑:程序博客网 时间:2024/05/22 12:59
#include <iostream>#include<cstring>using namespace std;typedef struct Trie_node{    int count;                    // 统计单词前缀出现的次数    struct Trie_node* next[26];   // 指向各个子树的指针    bool exist;                   // 标记该结点处是否构成单词}TrieNode , *Trie;TrieNode* createTrieNode(){    TrieNode* node = new TrieNode;    node->count = 0;    node->exist = false;    memset(node->next , 0 , 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] = createTrieNode();        }        node = node->next[id];  // 每插入一步,相当于有一个新串经过,指针向下移动        ++p;        node->count += 1;      // 这行代码用于统计每个单词前缀出现的次数(也包括统计每个单词出现的次数)    }    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(){    Trie root = createTrieNode();    int n;    char str[12];    cin>>n;    for(int i=0;i<n;i++)    {        cin>>str;        Trie_insert(root,str);    }     int m;     char word[12];     cin>>m;     for(int i=0;i<m;i++)     {         cin>>word;         cout<<Trie_search(root,word)<<endl;     }    return 0;}
0 0
原创粉丝点击