由于那些树木的名称中含有空格,而空格的ASCALL码为32,A-Z的ASCALL码为65-90,
a-z的ASCALL码为97-122。
所以next数组要开到比 122-32=90大,开到92应该足够了,但是只有开到95才不会seg error。
输入好难控制啊- –
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define MX 95
using namespace std;
struct node
{
int num;
char name[35];
node *next[MX];
};
int cnt;
void init(node* &rt)
{
rt = (node *)malloc(sizeof(node));
rt->num = 0;
for(int i=0;i<MX;i++)
rt->next[i] = NULL;
}
void insert(char *s,node *rt)
{
int len = strlen(s);
for(int i=0;i<len;i++)
{
if(rt->next[s[i]-' ']==NULL)
{
node *t = (node*)malloc(sizeof(node));
for(int j=0;j<MX;j++)
t->next[j] = NULL;
t->num = 0;
rt->next[s[i]-' '] = t;
}
rt = rt->next[s[i]-' '];
}
if(rt->num) rt->num++;
else
{
rt->num = 1;
strcpy(rt->name,s);
}
}
void dfs(node *rt)
{
if(rt->num)
{
printf("%s %.4lf\n",rt->name,rt->num*100.0/cnt);
return;
}
for(int i=0;i<MX;i++)
{
if(rt->next[i]!=NULL)
dfs(rt->next[i]);
}
}
void destroy(node *rt)
{
if(rt->num)
{
free(rt);
return;
}
for(int i=0;i<MX;i++)
{
if(rt->next[i]!=NULL)
destroy(rt->next[i]);
}
free(rt);
return;
}
int main()
{
node * rt;
char s[35];
int flag = 0;
while(gets(s))
{
if(flag)
printf("\n");
else flag = 1;
init(rt);
cnt = 0;
insert(s,rt);
cnt++;
while(gets(s) && strlen(s))
{
insert(s,rt);
cnt++;
}
dfs(rt);
destroy(rt);
}
return 0;
}