统计难题(hdu 1251) (字典树)

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

统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 54907    Accepted Submission(s): 19183

Problem Description

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

Output

对于每个提问,给出以该字符串为前缀的单词的数量.

Sample Input

banana band bee absolute acm ba b band abc

Sample Output

2 3 1 0

#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;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值