【UOJ 651】阔叶林

【题目描述】:

阔叶林是一种植物群落,其中的树木都具有叶子面子很大这一共同特征,多结坚果,冬天会进入休眠状态。美国的温度和气候创造了近百种阔叶物种,如橡树、枫树、樱桃树等等,阔叶树几乎占全美树种的40%左右。另一方面,针叶树在美国也随处可见,如雪松、冷杉、铁杉、红杉等。一般针叶树在家里被用作装饰性的木材。

现自然资源部门使用卫星成像技术,在每一天都编制了一张图像清单,记录了一定范围内的每一颗树,现在需要你编程计算每一天卫星观测到的树种,所占的比例。

【输入描述】:

给出一张树的清单(由卫星拍摄,以树种名称给出),每一颗树占一行,树名不超过30个字符,其中树会重复出现,不会超过10,000个树种,也不会超过1,000,000棵树。

【输出描述】:

对于每个测例都需要按字典升序给出每种树的树名和其占总数的百分比(保留4位小数),每种树各占一行。

【样例输入】:

Red Alder
Ash
Aspen
Basswood
Ash
Beech
Yellow Birch
Ash
Cherry
Cottonwood
Ash
Cypress
Red Elm
Gum
Hackberry
White Oak
Hickory
Pecan
Hard Maple
White Oak
Soft Maple
Red Oak
Red Oak
White Oak
Poplan
Sassafras
Sycamore
Black Walnut
Willow

【样例输出】:

Ash 13.7931
Aspen 3.4483
Basswood 3.4483
Beech 3.4483
Black Walnut 3.4483
Cherry 3.4483
Cottonwood 3.4483
Cypress 3.4483
Gum 3.4483
Hackberry 3.4483
Hard Maple 3.4483
Hickory 3.4483
Pecan 3.4483
Poplan 3.4483
Red Alder 3.4483
Red Elm 3.4483
Red Oak 6.8966
Sassafras 3.4483
Soft Maple 3.4483
Sycamore 3.4483
White Oak 10.3448
Willow 3.4483
Yellow Birch 3.4483

【样例说明】:

树名不超过30个字符,不一定只有字母,包括所有可见字符和空格ascii码范围为32~126。

【时间限制、数据范围及描述】:

时间:1s 空间:128M

对于 30%数据:不会超过50个树种,也不会超过10,000棵树。

对于 70%数据:不会超过50个树种,也不会超过100,000棵树。

对于100%数据:不会超过1000个树种,也不会超过500,000棵树。

题解:这道题好多做法啊,现附上trie树的做法啦!QWQ

          (一定要及时写博客mad,几天前写的代码今天就有几行没看懂,反应了好久awsl)

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=500005; 
struct node{
    int c;
    map<char,int>p;
}trie[N];
int cnt=1,n;
void inss(char *s){
    int i=0,u=1;
    while(s[i]){
        if(trie[u].p.count(s[i])) u=trie[u].p[s[i++]];
        else u=trie[u].p[s[i++]]=++cnt;
    }
    ++trie[u].c;
}
char yc[35],a[35];
void dfs(int l,int u){
    if(trie[u].c){
        for(int i=0;i<l;i++) printf("%c",yc[i]);
        printf(" %.4f
",(double)trie[u].c/n*100);
    }
    for(int i=32;i<=126;++i)
        if(trie[u].p.count((char)i))  yc[l]=i, dfs(l+1,trie[u].p[i]); 
}
int main(){
    //freopen("kuo.in","r",stdin);
    //freopen("kuo.out","w",stdout); 
    while(gets(a)) { n++; inss(a); }
    //cout<<66;
    dfs(0,1);
    return 0;
}
原文地址:https://www.cnblogs.com/wuhu-JJJ/p/13511513.html