动物统计加强版(贪心,字典序)
动物统计加强版
- 描述
- 在美丽大兴安岭原始森林中存在数量繁多的物种,在勘察员带来的各种动物资料中有未统计数量的原始动物的名单。科学家想判断这片森林中哪种动物的数量最多,但是由于数据太过庞大,科学家终于忍受不了,想请聪明如你的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][26],val[MAXN];//ch[MAXN][26]里的MAXN还没开够应该开到MAXN*12,数据量太大了
//肯定me了
char ans[12];
int sz,mm;
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]++;}if(word[k]>mm){mm=word[k];memcpy(ans,s,sizeof(s));}
}
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;int i,j;sz=0;SI(N);mm=0;char s[12];F(i,N){scanf("%s",s);join(s);}printf("%s %d\n",ans,mm);return 0;
}
自己写了一发链表ac了;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{int num;Node *next[30];
};
Node *root;
char ans[12],s[12];
int mm;
void insert(char *s){Node *p=root,*q;for(int i=0;s[i];i++){int j=s[i]-'a';if(p->next[j]==NULL){q=(Node *)malloc(sizeof(Node));q->num=0;for(int k=0;k<30;k++)q->next[k]=NULL;p->next[j]=q;}p=p->next[j];}if(++p->num>mm){mm=p->num;memcpy(ans,s,sizeof(s));}
}
void freeroot(Node *r){for(int i=0;i<30;i++){if(r->next[i]!=NULL){freeroot(r->next[i]);free(r->next[i]);}else free(r->next[i]);}
}
void initial(){root=(Node *)malloc(sizeof(Node));root->num=0;for(int i=0;i<30;i++)root->next[i]=NULL;
}
int main(){int N;scanf("%d",&N);initial();mm=0;while(N--){scanf("%s",s);insert(s);}printf("%s %d\n",ans,mm);freeroot(root);//不加也可以为了优化内存,加了反而时间长一些; return 0;
}
大神的链表;
#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;
}
过段时间又写了下,一遍A,感觉比以前写的要简单些了;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define P_ printf(" ")
const int INF=0x3f3f3f3f;
const int MAXN=4000010;//要开的足够大
char ans[15];
int cur;
struct Node{int num;Node* next[30];Node init(){for(int i=0;i<30;i++)next[i]=NULL;num=0;}
};
Node head;
void insert(char *s){int j;Node *p=&head,*q;for(int i=0;s[i];i++){j=s[i]-'a';if(p->next[j]==NULL){q=(Node *)malloc(sizeof(Node));q->init();p->next[j]=q;}p=p->next[j];}p->num++;if(p->num>cur){strcpy(ans,s);cur=p->num;}
}
int main(){int N;char s[15];while(~scanf("%d",&N)){head.init();cur=0;for(int i=0;i<N;i++){scanf("%s",s);insert(s);}printf("%s %d\n",ans,cur);}return 0;
}
java代码:很奇怪的说java返回数组出现了一些问题,
链接会造成返回的数组结果是地址,出错,不连接就可以输出数组内容
import java.util.Scanner;public class nyoj290{public static void main(String[] argv){tire atire = new tire();Scanner cin = new Scanner(System.in);int N = cin.nextInt();char s[] = new char[20];while(N-- > 0){s = cin.next().toCharArray();atire.insert(s);}char[] xx = "hello".toCharArray();//System.out.println(getanimal1(xx));//System.out.print(atire.getanimal()+" " + atire.getnum());//链接会造成返回的数组结果是地址,出错,不连接就可以输出数组内容System.out.print(atire.getanimal());System.out.println(" " + atire.getnum());} } class tire{private Node head = new Node();private int number;private static char[] animal;public tire(){number = 0;animal = new char[20];}public void insert(char[] s){Node p = head, q;int j;for(int i = 0; i < s.length; i++){j = s[i] - 'a';if(p.next[j] == null){p.next[j] = new Node();}p = p.next[j];}p.num++;if(p.num > number){number = p.num;animal = s;//System.out.println(animal); }}public int getnum(){return number;}public char[] getanimal(){//System.out.println(animal);return animal;} } class Node{public int num;public Node[] next = new Node[30];public Node(){for(int i = 0; i < 30; i++){next[i] = null;}num = 0;} }
人之初,性本善。性相近,习相远。
动物统计加强版(贪心,字典序)相关推荐
- 南阳oj 题目290 动物统计加强版 字典树
动物统计加强版 时间限制:3000 ms | 内存限制:150000 KB 难度:4 描述 在美丽大兴安岭原始森林中存在数量繁多的物种,在勘察员带来的各种动物资料中有未统计数量的原始动物的名单.科学家 ...
- P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希)
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希) 洛谷上这道水题丧心病狂地把数据范围加到了500000 普通的做法肯定A不了了, ...
- NYOJ 286 动物统计
动物统计 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 在美丽大兴安岭原始森林中存在数量繁多的物种,在勘察员带来的各种动物资料中有未统计数量的原始动物的名单.科学家想判 ...
- 【HDU 1735】字数统计(贪心,有缺陷的一道题)
题目分析: 告知有m段,第一行一定带领一段,所以要找出另外m-1段. 由于题目要求最少有多少字被破坏,所以我们要找出的m-1段要求被破损的最少,即是"好"的部分最多. 满足一段开头 ...
- NYOJ286 动物统计
原题链接 简单题. 附ac代码: #include <iostream> #include <string> #include <vector> #include ...
- 算法_贪心 刷题总结
目录 贪心真的太玄学了 1.入门级 2.区间覆盖升级版(多重区间覆盖) 3.CF1066B Heaters 4.拿东西(贪心+博弈) P1209 [USACO1.3]修理牛棚 Barn Repair( ...
- Conclusion
/* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...
- greedy算法/算法导论/挑战程序设计竞赛
贪婪算法 贪心算法自顶向下,常规递归->尾递归->迭代.每次看一个解. 贪心算法的选择: 1.一个全局最优解可以通过局部最优(贪心)来选择达到. 2.我们所做的选择总是当前看起来最佳的的选 ...
- 重走长征路---OI每周刷题记录---8月16日 2014
总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...
最新文章
- 自动转发outlook的邮件
- [转载]dorado学习笔记(二)
- 使用vscode删除markdown空行
- 【HDU - 5875】Function(线段树,区间第一个小于某个数的数 或 RMQ二分)
- 12月第2周业务风控关注 | 公安部:严打自媒体“网络水军”违法犯罪,关闭大V账号1100余个...
- Go Elasticsearch 快速入门
- 《Nmap渗透测试指南》—第2章2.8节ICMP Ping Types扫描
- winform+c#之窗体之间的传值
- LayIM v2.x 正式开源,Web 即时通讯前端解决方案
- 深入浅出Go Runtime
- 爬虫:requests BeautifulSoup 实战案例
- 21年美赛F题-DEA模型和逻辑回归模型
- 局域网下两台电脑ping不通的问题
- Spark 高难度对话 SQL Server 续篇
- poi读取excel表
- Beam search 算法的通俗理解
- PLA在计算机领域是什么意思,pla(pla是什么工作)
- C语言sopc蜂鸣器按键弹奏中音,SOPC乐曲演奏大作业.doc
- pr安装无法启动 计算机丢失,为什么pr安装成功却无法启动?
- android 字节转wav,android开发:把一个byte数组转换成wav音频文件,并且播放
热门文章
- 小强升职记梗概_《小强升职记》读后感
- 如何从零开始学python_从零开始学Python【4】--numpy
- win7 修复计算机 黑屏,boot bcd修复win7 旗舰版系统黑屏错误代码0xc0000034的解决方法...
- Php数组面包屑导航,PHP 导航提示(面包屑型轨迹)
- 计算机网络:TCP滑动窗口的流量控制和拥塞控制
- linux裸设备文件系统,Linux当中的文件系统
- linux平台的office文档转pdf的实例(程序员的菜)
- 详解IIS中URL重写工具的规则条件(Rule conditions)
- C# 创建、部署、调用WebService
- qq推广 qq在线客服工具