POJ 2418 Hardwood Species Trie树模板

恩恩,好久不写Blog了
这次是我的首个Trie树,例题是POJ2418,次元传送门在这里

题意:
输入若干个字符串,注意中间可能带有空格哈(就是说不要用cin之类的了,用gets()就好),请你统计一下每一种字符串的出现频率(就是出现次数/总字符串数),并按字典序依次输出这些归并后的字符串并输出百分比形式的频率。

分析:
嘛嘛,感觉此题解法很不唯一啊,不过是来联系Trie树的是不是,老老实实学模板吧。
那么,此题中Trie结构体中除了指向下一级的指针数组之外,还应该有个num变量用来统计以该节点作为结尾的字符串的数量,当然初始化就是0喽。

然后,客官请看代码吧。

代码实现

#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
char ans[50];
int cnt=0;
struct trie{
    int num;
    trie *next[256];
    trie(){
        num=0;
        for(int i=0;i<256;i++)
            next[i]=NULL;
    }
}root;
inline void insert(char *str){
    trie *r=&root;
    for(int i=0;str[i]!='\0';i++){
        if(!r->next[str[i]])
            r->next[str[i]]=new trie;
        r=r->next[str[i]];
    }
    r->num++;
}
inline void dfs(trie *r,int d){
    if(r->num)  ans[d]=0,printf("%s %.4f\n",ans,100*r->num/(double)cnt);
    for(int i=0;i<256;i++)
        if(r->next[i])  ans[d]=i,dfs(r->next[i],d+1);
}
int main(){
    char str[50];
    while(gets(str))
        insert(str),++cnt;
    dfs(&root,0);
    return 0;
}

嗯嗯,写完之后感觉Trie树还是蛮简单的,只是看这个Time略………………………..
嗯嗯,写完收工,洗洗睡了 (●’◡’●)

By YOUSIKI

你可能感兴趣的:(POJ 2418 Hardwood Species Trie树模板)