Problem Description
随着卫星成像技术的应用,自然资源研究机构可以识别每一个棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。
Input
输入一组测试数据。数据的第1行给出一个正整数N (n <= 100000),N表示树的数量;随后N行,每行给出卫星观测到的一棵树的种类名称,树的名称是一个不超过20个字符的字符串,字符串由英文字母和空格组成,不区分大小写。
Output
按字典序输出各种树的种类名称和它占的百分比,中间以空格间隔,小数点后保留两位小数。
Example Input
2 This is an Appletree this is an appletree
Example Output
this is an appletree 100.00%
Code:
#include <bits/stdc++.h>
using namespace std;
int n;
struct node
{
struct node *l, *r;
char a[21];
int cnt;
};
struct node *create(struct node *root, char s[])
{
if(!root)
{
root = new struct node();
strcpy(root->a, s);
root->cnt=1;
root->l = root->r = NULL;
}
else
{
if(strcmp(root->a, s)==0)
{
root->cnt++;
}
else if(strcmp(root->a, s)>0)
{
root->l = create(root->l, s);
}
else if(strcmp(root->a, s)<0)
{
root->r = create(root->r, s);
}
}
return root;
};
void por(struct node *root)
{
if(root)
{
por(root->l);
printf("%s %.2lf%%\n", root->a, 100.0*root->cnt/n);
por(root->r);
}
}
int main()
{
char s[21];
int len, i, k;
cin >> n;
getchar();
k = n;
struct node *root = NULL;
while(k--)
{
gets(s);
len = strlen(s);
for(i=0; i<len; i++)
if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]-'A'+'a';
root = create(root, s);
}
por(root);
return 0;
}