动物统计加强版
时间限制:3000 ms | 内存限制:150000 KB
难度:4
描述
在美丽大兴安岭原始森林中存在数量繁多的物种,在勘察员带来的各种动物资料中有未统计数量的原始动物的名单。科学家想判断这片森林中哪种动物的数量最多,但是由于数据太过庞大,科学家终于忍受不了,想请聪明如你的ACMer来帮忙。
输入
第一行输入动物名字的数量N(1<= N <= 4000000),接下来的N行输入N个字符串表示动物的名字(字符串的长度不超过10,字符串全为小写字母,并且只有一组测试数据)。
输出
输出这些动物中最多的动物的名字与数量,并用空格隔开(数据保证最多的动物不会出现两种以上)。
样例输入
10
boar
pig
sheep
gazelle
sheep
sheep
alpaca
alpaca
marmot
mole
样例输出
sheep 3
http://acm.nyist.net/JudgeOnline/problem.php?pid=290
//统计每个字符串最后一个字符出现的次数,即是该字符串出现的次数。
#include<string.h>
#include<malloc.h>
#include<stdio.h>
int MAX_NUM;
char ss[15];
typedef struct node
{
int count;
struct node *next[26];
}*tree;
void insert(tree h,char *s)
{
tree p=h;
int len=strlen(s),i;
for(i=0;i<len;i++)
{
int index=s[i]-'a';
if(p->next[index]!=NULL)
{
p=p->next[index]; //到最后一个字符
}
else
{
tree tem=(tree)calloc(1,sizeof(node));
tem->count=0;
p->next[index]=tem;
p=tem;
}
}
p->count++;
if(p->count>MAX_NUM)
{
MAX_NUM=p->count;
strcpy(ss,s);
}
}
void release(tree h)
{
int i;
for(i=0;i<26;i++)
if(h->next[i]!=NULL)
release(h->next[i]);
free(h);
}
int main()
{
//freopen("b.txt","r",stdin);
char s[14];
int t,n,i;
MAX_NUM=0;
tree head=(tree)calloc(1,sizeof(node));
scanf("%d\n",&n);
for(i=0;i<n;i++)
{
scanf("%s",s);
insert(head,s);
}
printf("%s ",ss);
printf("%d\n",MAX_NUM);
release(head);
return 0;
}