【hihoCoder】1014

#include
#include
using namespace std;
//节点类型的结构体
struct TrieNode
{
    int num;//
    TrieNode * child[26];//当前节点的子节点
    TrieNode()//初始化子节点
    {
        num = 0;
        memset(child, NULL, sizeof(child));
    }
};

TrieNode * root;//名字为root的指向节点的指针
int temp;
//加入单词
void insert(string word)
{
    if(word.empty()) return;

    TrieNode * p = root;
    //如果当前所查询的节点没有这个要插入单词当前字母的分支
    //那么就新建节点
    for(int i = 0; i < word.size(); i++)
    {
        temp = word[i] - 'a';
        if(p -> child[temp] == NULL)
        {
            p -> child[temp] = new TrieNode;
        }
        p = p -> child[temp];
        p -> num++;//就是指向节点p的这个字母出现的次数。
    }
}

int prefixNumber(string pre)
{
    if(pre.empty()) return 0;

    TrieNode * p = root;
    for(int i = 0; i < pre.length(); i++)
    {
        temp = pre[i] - 'a';
        if(p -> child[temp] == NULL)
            return 0;
        p = p -> child[temp];
    }
    return p -> num;//前缀最后一个字母出现的次数
}

int main()
{
    int n, m;
    string word, pre;
    root = new TrieNode;
    while(cin >> n)
    {
        while(n--)
        {
            cin >> word;
            insert(word);
        }
        cin >> m;
        while(m--)
        {
            cin >> pre;
            int res = prefixNumber(pre);
            cout << res << endl;
        }
    }

    return 0;
}

你可能感兴趣的:(hihoCoder)