zoukankan      html  css  js  c++  java
  • PTA 天梯赛训练 词频统计(map+vector)

    请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。

    所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。

    输入格式:

    输入给出一段非空文本,最后以符号#结尾。输入保证存在至少10个不同的单词。

    输出格式:

    在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。

    随后按照词频递减的顺序,按照词频:单词的格式输出词频最大的前10%的单词。若有并列,则按递增字典序输出。

    输入样例:

    This is a test.
    
    The word "this" is the word with the highest frequency.
    
    Longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee.  But this_8 is different than this, and this, and this...#
    this line should be ignored.
    

    输出样例:(注意:虽然单词the也出现了4次,但因为我们只要输出前10%(即23个单词中的前2个)单词,而按照字母序,the排第3位,所以不输出)

    23
    5:this
    4:is
    #include<bits/stdc++.h>
    using namespace std;
    typedef pair<string,int> psi;
    int cmp(psi a,psi b)
    {
        if(a.second>b.second)   //先以单词数量从大到小排序 
            return 1;
            
        if(a.second==b.second)  //如果数量相等 
            if(a.first<b.first) //再以字典序升序排序 
                return 1;
                
        return 0;
    }
    int main()
    {
        map<string,int>ma;
        map<string,int>::iterator it; 
        vector<psi>ve;
        string s;
        char ch;
        while(1) 
        {
            ch=getchar();
            if(ch=='#')break;
            if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')||(ch=='_'))
            {
                if(s.size()<=14)  
                {
                    if(ch>='A'&&ch<='Z')ch+=32;
                    s+=ch;
                }
            }
            else
            {
                if(s.size()>0)ma[s]++;
                s.clear();
            }
        }
        for(it=ma.begin();it!=ma.end();it++)
            ve.push_back(psi(it->first,it->second));
    
        sort(ve.begin(),ve.end(),cmp);
        cout<<ma.size()<<endl;
        int cnt=(int)(ma.size()*0.1);      //前10%的单词
         
        for(int i=0;i<cnt;i++)
            cout<<ve[i].second<<':'<<ve[i].first<<endl;
        return 0;
    }
    
    
  • 相关阅读:
    net core 使用 rabbitmq
    asp.net core WebApi 返回 HttpResponseMessage
    asp.net core 2.1 WebApi 快速入门
    JQuery EasyUI combobox动态添加option
    php截取字符去掉最后一个字符
    JQuery EasyUI Combobox的onChange事件
    对于不返回任何键列信息的 selectcommand 不支持 updatecommand 的动态 sql 生成
    Access2007 操作或事件已被禁用模式阻止解决办法
    Easyui 中 Tabsr的常用方法
    Win 7 IE11不能下载文件,右键另存为也不行
  • 原文地址:https://www.cnblogs.com/kannyi/p/8594592.html
Copyright © 2011-2022 走看看