hdu2072单词数 字典树做法

本文详细介绍了如何使用字典树解决HDU2072中的单词计数问题。通过修改字典树的插入函数,确保在未添加过的单词末尾增加计数。实例代码提供了实现细节。

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



HDU2072

--------刚刚校赛被学弟无情虐了一番,于是回到寝室躲到角落找个水题来缓解下心中愤闷

          《单词数》 这题用的字典树做的,wa了好多次,感觉后台数据有点点问题。。 题意很简单了,就素从一篇长文中找出有多少种单词。。字典树insert函数稍作修改就可以, 就是最后单词尾节点如果从来没被赋值成1过(就是字典树没添加过这个单词)就+1;


          字典树的意思就是先给一个根节点,然后顺着这条根节点往下连接儿子节点的那条边作为单词的一个字母,如果存在这个字母就下去找那个儿子节点,然后同理找下一个字母。不存在这个字母的话,根节点就再生一个儿子,然后继续不断地生..查找同理,字母不存在就说明没这个单词


本题水代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;

char s[1000000+5];
char s2[1000000+5];
int ch[1000000+5][26];
int val[1000000+5], tmp, ans;
void insert(char *a)
{
    int rt = 0;
    for (int i = 0; a[i]; i++)
    {
        int c = a[i] - 'a';
        if (ch[rt][c] == 0)
        {
            val[tmp] = 0;
            //memset(ch[rt], 0, sizeof (ch[rt]));这句话去掉感觉完全没问题
            ch[rt][c] = tmp++;
        }
        rt = ch[rt][c];
    }
    if (val[rt] == 0) ans++;
    val[rt] = 1;
}

int main()
{
    while (gets(s) && strcmp(s, "#"))
    {
        int i, j, top = 0;
        tmp = 1, ans = 0;
        val[0] = 0;
        memset(ch[0], 0, sizeof(ch[0]));
        for (i = 0; i <= strlen(s); i++)
        {
            if (s[i] >= 'a' && s[i] <= 'z')
            //如果写成if (s[i] != ' ' && s[i] != '\0')就不行,不是说好的只有空格和小字母吗?
            s2[top++] = s[i];
            else
            {
                if (top != 0)
                {s2[top] = '\0';
                top = 0;
                insert(s2);}
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值