题目描述
在美丽大兴安岭原始森林中存在数量繁多的物种,在勘察员带来的各种动物资料中有未统计数量的原始动物的名单。科学家想判断这片森林中哪种动物的数量最多,但是由于数据太过庞大,科学家终于忍受不了,想请聪明如你的ACMer来帮忙
输入
第一行输入动物名字的数量N(1<= N <= 4000000),接下来的N行输入N个字符串表示动物的名字(字符串的长度不超过10,字符串全为小写字母,并且只有一组测试数据)
输出
输出这些动物中最多的动物的名字与数量,并用空格隔开(数据保证最多的动物不会出现两种以上)。
样例输入
10
boar
pig
sheep
gazelle
sheep
sheep
alpaca
alpaca
marmot
mole
样例输出
sheep 3
很明显的 字典树问题 看起来好看 但是 不好用呀....
所有的结构 算法 都是一种思想 重要的是掌握这一种思想 知道是怎么回事 然后在不同的环境下 对其进行一点点的 改变 就可以达到不同的效果.
1 /* 有看不懂的 错误看看 是不是 定义重复了 */ 2 #include<stdio.h> 3 #include<malloc.h> 4 #include<string.h> 5 struct node 6 { 7 int sum; 8 node *next[26]; 9 }; 10 int Insert(char a[],node *t); //这个 放到 函数声明的上面 会出现 node 没有声明的错误 11 int main() 12 { 13 int i,n,sum,maxn=0; 14 char a[12],b[12]; 15 while(scanf("%d",&n)!=EOF) 16 { 17 node *t; 18 t=(node *)malloc(sizeof(node)); //开辟一个根节点 每次 加入新单词 19 t->sum=0; // t 就作为 了 根节点 20 for(i=0;i<26;i++) 21 t->next[i]=NULL; 22 maxn=0; 23 while(n--) 24 { 25 scanf("%s",a); 26 sum=Insert(a,t); 27 if(sum>maxn) 28 { 29 maxn=sum; 30 strcpy(b,a); 31 } 32 } 33 printf("%s %d\n",b,maxn); 34 } 35 return 0; 36 } 37 int Insert(char *a,node *t) 38 { 39 node *p,*q; 40 int id,i,j,l; 41 p=t; // 已经开了空间 42 l=strlen(a); 43 for(i=0;i<l;i++) 44 { 45 id=a[i]-'a'; 46 if(p->next[id]==NULL) //如果 没有 这个线段的话 47 { 48 q=(node *)malloc(sizeof(node)); 49 q->sum=0; 50 for(j=0;j<26;j++) 51 q->next[j]=NULL; 52 p->next[id]=q; // 建立线段 . 线段 的 另一端 已经设置好了. 53 } 54 p=p->next[id]; 55 } 56 (p->sum)++; 57 return p->sum; 58 }