HDU1251 统计难题

本文介绍了一种利用字典树解决前缀匹配问题的方法。通过构建字典树,可以高效地统计给定前缀在字典中出现的次数。文章详细解释了字典树的插入和查询操作,并提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251

二. 题目大意:给若干个单词,做为字典。再给出若干前缀,问每个前缀分别在字典的单词中出现多少次。

三. 思路:字典树模板题。所谓字典树,按本题来说,

1.首先有一个没有存信息的root,每个节点有26(字符集个数)个儿子。

2.插入操作:给一个单词,从第一个字符开始,依次从根节点开始,如果不存在此字符,新建一个新节点,否则,节点的计数域加1,循环一直到单词最后一个字符。

3.查询操作:给一个前缀,从第一个字符开始,依次从根节点开始,如果不存在,返回0,否则,查询完毕返回计数域中的数。

四.代码:

#include <cstdio>
#include <cstring>

using namespace std;

const int MAX_N = 26;
const int INF = 0x3f3f3f3f;

struct node
{
    int cnt;
    node* next[MAX_N];
}heap[500000], root;

int top;
node *newNode()
{
    return &heap[top++];
}

void addNode(char *str)
{
    int len = strlen(str), i;
    node *p = &root, *q;

    for(i = 0; i < len; i++){
        int key = str[i] - 'a';
        if(p->next[key] == NULL){
            q = newNode();
            q->cnt = 1;
            memset(q->next, 0, sizeof(q->next));
            p->next[key] = q;
            p = p->next[key];
        }
        else{
            p = p->next[key];
            p->cnt++;
        }
    }
}

int Find(char *str)
{
    node *p = &root;
    int i, key;
    for(i = 0; str[i]; i++){
        key = str[i]-'a';
        if(p->next[key] == NULL)
            return 0;
        p = p->next[key];
    }
    return p->cnt;
}

int main()
{
    //freopen("in.txt", "r", stdin);

    char tmp[12];
    while(gets(tmp) && tmp[0])
        addNode(tmp);

    while(~scanf("%s", tmp))
        printf("%d\n", Find(tmp));
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值