您的位置:首页 > 其它

POJ - 2418 Hardwood Species(map,trie,BST)

2015-11-06 12:43 295 查看
1、输入若干行树名,输入结束后,按字典序输出树名及其所占百分比。

2、多种方法:map,trie,BST

3、

map:

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

const int MAX=128;
char tree[10005][35];//存储不同的树名
int species=0;//树的种类数目
int totalNum=0;//树的总数目

struct Trie
{
Trie *next[MAX];
int num;//出现次数
};
Trie *root=new Trie;

void createTrie(char *str)
{
++totalNum;
int len = strlen(str);
Trie *p = root, *q;
for(int i=0; i<len; ++i)
{
int id = str[i];
if(p->next[id] == NULL)
{
q = (Trie *)malloc(sizeof(Trie));
//q = new Trie;
for(int j=0; j<MAX; ++j){
q->next[j] = NULL;
q->num=0;
}
p->next[id] = q;
}
p = p->next[id];
}
if(p->num==0)strcpy(tree[species++],str);
++p->num;
}
int findTrie(char *str)
{
int len = strlen(str);
Trie *p = root;
for(int i=0; i<len; ++i)
{
int id = str[i];
p = p->next[id];
if(p == NULL)   //若为空集,表示不存以此为前缀的串
return 0;
}
return p->num;
}
int cmp(const void *a,const void *b){
return strcmp((char *)a,(char *)b);//升序
}
int main()
{
char str[35];
int i;
for(i=0; i<MAX; i++){
root->next[i]=NULL;
root->num=0;
}
while(gets(str)){
createTrie(str);
}
qsort(tree,species,sizeof(tree[0]),cmp);
for(i=0;i<species;++i)
printf("%s %.4f\n",tree[i],double(findTrie(tree[i]))/double(totalNum)*100);
return 0;
}


View Code
BST:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: