zoj 1899 Hardwood Species (字典树trie统计)

由于那些树木的名称中含有空格,而空格的ASCALL码为32,A-Z的ASCALL码为65-90,

a-z的ASCALL码为97-122。

所以next数组要开到比  122-32=90大,开到92应该足够了,但是只有开到95才不会seg  error。


输入好难控制啊- –

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define MX 95

using namespace std;

struct node
{
    int num;
    char name[35];
    node *next[MX];
};
int cnt;
void init(node* &rt)
{
    rt = (node *)malloc(sizeof(node));
    rt->num = 0;
    for(int i=0;i<MX;i++)
        rt->next[i] = NULL;
}
void insert(char *s,node *rt)
{
    int len = strlen(s);
    for(int i=0;i<len;i++)
    {
        if(rt->next[s[i]-' ']==NULL)
        {
            node *t = (node*)malloc(sizeof(node));
            for(int j=0;j<MX;j++)
                t->next[j] = NULL;
            t->num = 0;
            rt->next[s[i]-' '] = t;
        }
        rt = rt->next[s[i]-' '];
    }
    if(rt->num) rt->num++;
    else
    {
        rt->num = 1;
        strcpy(rt->name,s);
    }
}
void dfs(node *rt)
{
    if(rt->num)
    {
        printf("%s %.4lf\n",rt->name,rt->num*100.0/cnt);
        return;
    }
    for(int i=0;i<MX;i++)
    {
        if(rt->next[i]!=NULL)
            dfs(rt->next[i]);
    }
}
void destroy(node *rt)
{
    if(rt->num)
    {
        free(rt);
        return;
    }
    for(int i=0;i<MX;i++)
    {
        if(rt->next[i]!=NULL)
            destroy(rt->next[i]);
    }
    free(rt);
    return;
}
int main()
{
    node * rt;
    char s[35];
    int flag = 0;
    while(gets(s))
    {
        if(flag)
            printf("\n");
        else flag = 1;
        init(rt);
        cnt = 0;
        insert(s,rt);
        cnt++;
        while(gets(s) && strlen(s))
        {
            insert(s,rt);
            cnt++;
        }
        dfs(rt);
        destroy(rt);
    }
    return 0;
}

    原文作者:Trie树
    原文地址: https://blog.csdn.net/u012841845/article/details/38366077
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注