欢迎使用CSDN-markdown编辑器

来源:互联网 发布:max 无法录入数据 编辑:程序博客网 时间:2024/04/28 19:08

hihoCoder 1014 Trie树

  • 输入
    输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。

  • 输出
    对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。


#include<string>#include<iostream>using namespace std;struct TrieNode{    int value;    bool end;    TrieNode* next[26];    TrieNode(){        value = 0;        end = false;        for (int i = 0; i < 26; i++)        {            next[i] = nullptr;        }    }};class Trie {private:    TrieNode *root;    TrieNode* insert(TrieNode* x, string word, int d)    {        if (x == nullptr) x = new TrieNode();        if (d == word.length()){ x->end = true; x->value++;  return x; }        char c = word[d];        x->value++;        x->next[c - 'a'] = insert(x->next[c - 'a'], word, d + 1);        return x;    }public:    void insert(string word)    {        root = insert(root, word, 0);    }    int getPrefixCount(string word)    {        TrieNode *p = root;        int i = 0;        while (p != nullptr && i<word.length())        {            p = p->next[word[i++] - 'a'];        }        if (p == nullptr)  return 0;        else  return p->value;    }    Trie()    {        root = nullptr;    }};int main(){    Trie trie = Trie();    int n = 0;    cin>>n;    for(int i = 0;i<n;i++)    {        string word;        cin>>word;        trie.insert(word);    }    int m;    cin>>m;    for(int j = 0;j<m;j++)    {        string prefix;        cin>>prefix;        cout << trie.getPrefixCount(prefix)<<endl;    }    return 0;}
0 0
原创粉丝点击