第十届河南省赛 问题 A: 谍报分析(以文本结束)

来源:互联网 发布:剑灵灵女捏脸数据下载 编辑:程序博客网 时间:2024/05/18 11:25

问题 A: 谍报分析

时间限制: 1 Sec  内存限制: 128 MB
提交: 10  解决: 9
[提交][状态][讨论版]

题目描述

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

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

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

输入

密文是由英语单词(小写字母)组成,有若干段。单词之间由一个或多个空格分开,自然段之后可以用一个“,”或“。”表示结束。整个内容的单词数量不超过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 8soldiers 5five 4in 4the 4twenty 4at 2be 2must 2shanghai 2

提示

解题思路:当时比赛的时候最大的bug就是解决输入结束问题,他要以文本结束,关于文本结束EOF我们需要首先了解它的下面几点知识:

1.EOF: 原为end of file的缩写,是定义在<stdio.h>里面的一个宏定义#define EOF(-1),是getchar(),scanf()读取到文件结尾时所返回的值,所以我们会用while((ch==getchar())!=EOF)去判断是否读到了文件尾。

(关于为什么是-1:因为getchar()函数的返回值介于0-127之间,扩展后也介于0~255之间,无论哪种情况。-1都不对应任何字符,所以该值可以直接标记文本结尾。)

2.关于Ctrl+Z:文件结尾标识符。

 在大多数UNIX和Linux系统中,在一行开始处按下Ctrl+D是作为文件结尾的信号

  在PC和许多微型计算机中,是按下Ctrl+Z作为文件结束的信号(注意是一行)

{

      1.如果Crtl+Z前面有字符(非回车)的话,编译器并不会停止程序,而是会把输入的这个Crtl+Z理解成你是想让计算机输出一个Crtl+Z对应的字符,即→。只有这时候当它输出完以后再输入一个Crtl+Z才会结束程序。(这是一种结束的办法但是不好,因为我们还输出了我们不需要的一个→)

     2.Crtl+Z位于字符串或字符后面还有一个作用是告诉编译器该行输入已经结束了,后面再有的东西不用看了,这也就是为什么第一个输入案例里光标没有换行,这也就是为什么第二个输入案例里只输出了一个箭头。

     3.正确的结束文件输入的办法应该是:如果这行前面没有字符或字符串,直接Ctrl+Z[回车]

                                                                     如果这行前面有字符或字符串,则先换行再Ctrl+Z[回车]

}

知道了前面的知识这道题就很好写啦。

我的github code链接:my github

我的code:

#include<iostream>#include<stdio.h>#include<string.h>#include<memory.h>#include<string>#include<algorithm>using namespace std;struct node{    string name;    int num;}a[501];bool cmp(node x,node y){    if(x.num!=y.num)        return x.num>y.num;    else        return x.name<y.name;}int main(){    char ch;    int ok=0,t=0;    string s="";    while(scanf("%c",&ch)!=EOF)    {        if(ch>='a'&&ch<='z')            s+=ch;        else        {            int i;            for(i=0;i<t;i++)            {                if(s==a[i].name)                {                    a[i].num++;                    s="";                    break;                }            }            if(i==t&&s!="")            {                a[t].name=s;                a[t].num=1;                t++;                s="";            }        }    }    sort(a,a+t,cmp);    for(int i=0;i<10;i++)       cout<<a[i].name<<" "<<a[i].num<<endl;    return 0;}


原创粉丝点击