HDU 1251 统计难题

将单词表中所有单词建立一棵字典树,再利用 (cnt)数组统计字典树中以每个字母结尾的字符串的个数。因此,在接下来的多次询问中,只需要返回单词最后一个字母对应的(cnt)数组值即可。

const int N=5e5+10;
int trie[N][26],cnt[N],idx;

void insert(string word)
{
    int p=0;
    for(int i=0;i<word.size();i++)
    {
        int k=word[i]-'a';
        if(!trie[p][k]) trie[p][k]=++idx;
        p=trie[p][k];
        cnt[p]++;
    }
}

int query(string word)
{
    int p=0;
    for(int i=0;i<word.size();i++)
    {
        int k=word[i]-'a';
        p=trie[p][k];
        if(!p) return 0;
    }
    return cnt[p];
}

int main()
{
    string word;
    while(getline(cin,word))
    {
        if(word.size() == 0) break;
        insert(word);
    }

    while(getline(cin,word))
        cout<<query(word)<<endl;
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14670367.html