首页 > 其他 > 详细

动物统计加强版(贪心,字典序)

时间:2015-11-28 15:01:15      阅读:249      评论:0      收藏:0      [点我收藏+]

动物统计加强版

时间限制: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,字典树me,map超时;

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define T_T while(T--)
#define F(i,x) for(i=0;i<x;i++)
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define P_ printf(" ")
const int MAXN=4000010;
struct Node{
	char s[12];
	int num;
	friend bool operator < (Node const &a,Node const &b){
		if(strcmp(a.s,b.s)<0)return true;
		 return false;
	}
}dt[MAXN];
int main(){
	int N;
	int i,j;
	SI(N);
	mem(dt,0);
	F(i,N){
		scanf("%s",dt[i].s);
		dt[i].num=1;
	}
	sort(dt,dt+N);
	int ans=0;
	int ms=0;
	for(i=1;i<N;i++){
			if(strcmp(dt[i].s,dt[i-1].s)==0)dt[i].num=dt[i-1].num+1;
			if(dt[i].num>ms){
			ms=dt[i].num;
			ans=i;
		}
	}
	printf("%s %d\n",dt[ans].s,ms);
	return 0;
}

  

map超时

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define T_T while(T--)
#define F(i,x) for(i=0;i<x;i++)
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define P_ printf(" ")
map<string,int>mp;
int main(){
	int N;
	char s[15],t[15];
	SI(N);
	int i;
	mp.clear();
	F(i,N){
		scanf("%s",s);
		mp[s]++;
	}
	map<string,int>::iterator iter;
	int ms=0;
	for(iter=mp.begin();iter!=mp.end();iter++){
		if(iter->second>ms){
			ms=iter->second;strcpy(t,iter->first.c_str());
		}
	}
	printf("%s %d\n",t,ms);
	return 0;
}

  字典树me

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define T_T while(T--)
#define F(i,x) for(i=0;i<x;i++)
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define P_ printf(" ")
const int MAXN=4000010;
int word[MAXN],ch[MAXN][30],val[MAXN];
char dt[MAXN][12];
int sz;
void join(char *s){
	int len=strlen(s),k=0;
	for(int i=0;i<len;i++){
		int j=s[i]-‘a‘;
		if(!ch[k][j]){
			mem(ch[sz],0);
			ch[k][j]=sz++;
		}
		k=ch[k][j];
		word[k]++;
	}
	val[k]=1;
}
int find(char *s){
	int i,j,len=strlen(s),k=0;
	F(i,len){
		j=s[i]-‘a‘;
		k=ch[k][j];
	}
	return word[k];
}
int main(){
	int N;
	char ans[12];
	int i,j;
	sz=0;
	SI(N);
	F(i,N){
		scanf("%s",dt[i]);
		join(dt[i]);
	}int ms=0;
	F(i,N){
		int temp=find(dt[i]);
		if(temp>ms){
			ms=temp;
			strcpy(ans,dt[i]);
		}
	}
	printf("%s %d\n",ans,ms);
	return 0;
}

  大神的链表字典序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;
}

  

动物统计加强版(贪心,字典序)

原文:http://www.cnblogs.com/handsomecui/p/5002632.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!