poj 2418 Trie

传送门

题意:给你很多树名,统计每个种类的所占比例,按树名从小到大输出。

思路:个人觉得不用字典树也应该能过,不过这里还是练一下吧。没事好说的,会字典树就会写。

代码跑了1400+ms

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
    int d[110];
    int id;
    int cnt;
} t[300005];
struct species
{
    string name;
    int num;
} s[10005];
char b[50];
int snum;
int tnum;
int sum;
void build(char *a)
{
    int l=strlen(a);
    int p=0;
    for(int i=0; i<l; i++)
    {
        if(t[p].d[a[i]-' ']==0)
        {
            t[p].d[a[i]-' ']=++tnum;
            p=tnum;
            memset(t[p].d,0,sizeof(t[p].d));
            t[p].id=0;
            t[p].cnt=0;
        }
        else
        {
            p=t[p].d[a[i]-' '];
        }
    }
    if(t[p].id==0)
    {
        ++snum;
        s[snum].name=a;
        t[p].id=snum;
    }
    t[p].cnt++;
    s[t[p].id].num=t[p].cnt;
}
bool cmp(species x,species y)
{
    return x.name<y.name;
}
int main()
{
    snum=tnum=sum=0;
    memset(t[0].d,0,sizeof(t[0].d));
    t[0].id=0;
    t[0].cnt=0;
    while(gets(b))
    {
        build(b);
        sum++;
    }
    sort(s+1,s+snum+1,cmp);
    for(int i=1;i<=snum;i++)
    {
        cout<<s[i].name<<" ";
        printf("%.4f\n",(double)(100*s[i].num)/(double)sum);
    }
    return 0;
}


你可能感兴趣的:(poj,Trie树,Baoge)