NYOJ 290 动物统计加强版 (字典树)

来源:互联网 发布:单片机最小系统图片 编辑:程序博客网 时间:2024/06/05 04:41

动物统计加强版

时间限制:3000 ms  |  内存限制:150000 KB
难度:4
描述
在美丽大兴安岭原始森林中存在数量繁多的物种,在勘察员带来的各种动物资料中有未统计数量的原始动物的名单。科学家想判断这片森林中哪种动物的数量最多,但是由于数据太过庞大,科学家终于忍受不了,想请聪明如你的ACMer来帮忙。
输入
第一行输入动物名字的数量N(1<= N <= 4000000),接下来的N行输入N个字符串表示动物的名字(字符串的长度不超过10,字符串全为小写字母,并且只有一组测试数据)。
输出
输出这些动物中最多的动物的名字与数量,并用空格隔开(数据保证最多的动物不会出现两种以上)。
样例输入
10boarpigsheepgazellesheepsheepalpacaalpacamarmotmole
样例输出
sheep 3

思路:在记录单词的最后为num加值,记录单词出现的次数,然后ans取最大值,sa数组存储目标字符串

ac代码:

#include<stdio.h>#include<string.h>#include<math.h>#include<stack>#include<iostream>#include<algorithm>#define fab(a) (a)>0?(a):(-a)#define LL long long#define MAXN 10010#define mem(x) memset(x,0,sizeof(x))#define INF 0xfffffff using namespace std;struct s{int num;s *next[26];};s *root;int ans=0;char sa[12];void create(char *str){int len=strlen(str);s *p=root,*q;for(int i=0;i<len;i++){int id=str[i]-'a';if(p->next[id]==NULL){q=(s *)malloc(sizeof(s));for(int j=0;j<26;j++)q->next[j]=NULL;q->num=0;p->next[id]=q;p=p->next[id];}else{//if(i==len-1)p=p->next[id];}}if(ans<++p->num){strcpy(sa,str);ans=p->num;}}void begin(){for(int i=0;i<26;i++)root->next[i]=NULL,root->num=0;}void freetree(s *t){if(t==NULL)return;for(int i=0;i<26;i++){if(t->next[i]!=NULL)freetree(t->next[i]);}free(t);return;}int main(){int t,i,n;char ss[12];int bz=0;root=(s *)malloc(sizeof(s));begin();scanf("%d",&n);for(i=0;i<n;i++){scanf("%s",ss);create(ss);}printf("%s %d\n",sa,ans);freetree(root);return 0;}



0 0