2017年河南省ACM省赛 Problem A: 谍报分析

问题 A: 谍报分析

时间限制: 1 Sec  内存限制: 128 MB

题目描述

“八一三”淞沪抗战爆发后,***几次准备去上海前线视察和指挥作战。但都因为宁沪之间的铁路和公路遭到了敌军的严密封锁,狂轰滥炸,一直未能成行。

***特科组织,其主要任务是保卫***的安全,了解和掌握敌方的动向。经过一段时间的监听,谍报组获取了敌方若干份密报,经过分析,发现密文中频繁出现一些单词,情报人员试图从单词出现的次数中,推出敌军的行动计划。

请你编程,快速统计出频率高的前十个单词。

输入

密文是由英语单词(小写字母)组成,有若干段。单词之间由一个或多个空格分开,自然段之后可以用一个“,”或“。”表示结束。整个内容的单词数量不超过10000,不同的单词个数不超过500.

输出

输出占10行,每行一个单词及出现的次数,中间一个空格。要求按频率降序输出,出现次数相同的单词,按字典序输出。

样例输入

shooting is at shanghai station. shooting  must  
be carried out. shooting  shooting.
shanghai station must be surrounded,  at least a 
team of  one hundred  soldiers to fight.  twenty  
five soldiers shooting in the north, twenty  five 
soldiers shooting in the south,  twenty  five 
soldiers  shooting in  the east, twenty  five 
soldiers shooting in the west.

样例输出

 
shooting 8
soldiers 5
five 4
in 4
the 4
twenty 4
at 2
be 2
must 2
shanghai 2

分析:

感觉本题是考察小知识点的运用,比如map的运用啊,结构体排序以及string与char字符串的转换。

我们可以先定义一个map将出现的单词进行统计,统计完了之后再将map进行遍历,将他的string与数量都取出存到结构体里,再按照题目要求进行排序,于是就出来啦。。

因为没有找到可以提交该题的oj,代码仅提供思路。。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<map>
using namespace std;

struct book{
	int num;
	char l[105];
}w[505];///结构体存单词及出现的次数

bool cmp(struct book a,struct book b)///对结构体进行排序
{
	if(a.num==b.num)
	{
		int d=strcmp(a.l,b.l);
		if(d<0)
			return true;
		else
			return false;
	}
	else
		return a.num>b.num;
}

int main()
{
	string s;
	map<string,int>p;
	map<string,int>::iterator it; 
	while(cin>>s)
	{
		int len=s.length();
		if(s[len-1]=='.'||s[len-1]==',')///如果结尾有这玩意,将其去掉
		{
			s=s.substr(0,len-1);
		}
		p[s]++;///统计
	}
	int k=0;
	for(it=p.begin();it!=p.end();it++)///遍历map
	{
		string h=(*it).first;///取出map里的string
		w[k].num=(*it).second;///取出map里的int,并存在结构体的对应变量里
		strcpy(w[k].l, h.c_str());///将string类型转换成char类型的字符串,存到结构体对应的字符串里
		k++;
	}
	sort(w,w+k,cmp);///对其进行排序
	for(int i=0;i<10;i++)///输出前十个单词
	{
		printf("%s %d\n",w[i].l,w[i].num);
	}
	return 0;
} 








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值