统计难题(hdu 1251)

头次接触字典树(可当模板用),解题思路来自


#include<bits/stdc++.h>//字典树动态模板
using namespace std;
const int maxn=26;
struct trie
{
    trie *next[maxn];
    int v;
}*a;//a为根节点,不存信息,是字典树的入口
void init()//初始化
{
    a=new trie;
    for(int i=0; i<maxn; i++)
        a->next[i]=NULL;
}
void trie_insert(char *s)
{
    int n=strlen(s);
    trie *p=a;//每次从根节点a开始查询
    p->v++;
    for(int i=0;i<n;i++)
    {
        int id=s[i]-'a';//对应字母和下标匹配
        if(p->next[id]==NULL)//字母不存在
        {
            p->next[id]=new trie;
            p=p->next[id];//和下一句顺序不能反
            p->v=1;
            for(int j=0;j<maxn;j++)
                p->next[j]=NULL;
        }
        else
        {
            p->next[id]->v++;
            p=p->next[id];
        }
    }
}
int trie_search(char *s)
{
    int n=strlen(s);
    trie *p=a;
    for(int i=0;i<n;i++)
    {
        int id=s[i]-'a';
        if(p->next[id]==NULL)//无查询结果
            return 0;
        else p=p->next[id];
    }
    return p->v;//前缀出现次数
}
void trie_delete(trie *root)//避免内存泄露
{
    if(root==NULL) return;
    else
    {
        for(int i=0;i<maxn;i++)
          trie_delete(root->next[i]);
    }
    delete (root);
}
int main()
{
    init();
    char s[100];
    while(gets(s))
    {
        if(strcmp(s,"")==0)
            break;
        trie_insert(s);
    }
    while(scanf("%s",s)==1)
        printf("%d\n",trie_search(s));
    trie *root=a;
    trie_delete(root);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/80201719
今日推荐