nyoj 290

动物统计加强版

时间限制: 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
来源

[陈玉 张云聪]原创

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int data_TrieNode;
struct TrieNode{
	int data;
	TrieNode *next[26];
	void init(){
		data=0;
		memset(next,0,sizeof(next));
	}
};

TrieNode *root=NULL;
int Build(char *c){
	TrieNode *p=root;
	TrieNode *q=NULL;
	int i,v,l=strlen(c);
	for(i=0;i<l;i++)
	{
		v=c[i]-'a';
		if(p->next[v]==NULL){
			q=new TrieNode();
			p->next[v]=q;
			p=p->next[v];
		}
		else p=p->next[v];
		
	}
	p->data++;
	return p->data;
}
int main()
{
	int n,s,i,p;
	char c[15],str[15];
	while(cin>>n)
	{
		s=0;
		root=new TrieNode();	
		for(i=0;i<n;i++)
		{
			scanf("%s",c);
			p=Build(c);
		    if(s<p){
			    s=p;
		        strcpy(str,c);
		    }
	    }
	    printf("%s %d\n",str,s);
	}
	return 0;
}

WR代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int data_TrieNode;
struct TrieNode{
	int data;
	TrieNode *next[26];
	void init(){
		data=0;
		memset(next,0,sizeof(next));
	}
}Tree[4000001];
inline TrieNode *new_TrieNode(){  
    Tree[data_TrieNode].init(); 
    return &Tree[data_TrieNode++];  
}
TrieNode *root=NULL;
void Build(char *c){
	TrieNode *p=root;
	TrieNode *q=NULL;
	int i,v,l=strlen(c);
	for(i=0;i<l;i++)
	{
		v=c[i]-'a';
		if(p->next[v]==NULL){
			q=new_TrieNode();
			p->next[v]=q;
		}
		p=p->next[v];
		p->data++;
	}
}
int Find(char *c){
	int i,v,l=strlen(c);
	TrieNode *p=root;
	for(i=0;i<l;i++)
	{
		v=c[i]-'a';
		if(p->next[v]==NULL){
			return 0;break;
		}
		else p=p->next[v];
	}
	return p->data;
}
int main()
{
	int n,s,i,p;
	char c[4000001][15];
	while(cin>>n)
	{
		data_TrieNode=0;
		s=0;
		root=new_TrieNode();	
		for(i=0;i<n;i++)
		{
			scanf("%s",c[i]);
			Build(c[i]);
		}
		for(i=0;i<n;i++)
		{
			p=Find(c[i]);
			if(s<p){
				s=p;
				strcpy(c[0],c[i]);
			} 
		}
	    printf("%s %d\n",c[0],s);
	}
	return 0;
}


你可能感兴趣的:(nyoj 290)