题意:给你很多树名,统计每个种类的所占比例,按树名从小到大输出。
思路:个人觉得不用字典树也应该能过,不过这里还是练一下吧。没事好说的,会字典树就会写。
代码跑了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;
}