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;
    }
    
    
  • 相关阅读:
    shell进行mysql统计
    java I/O总结
    Hbase源码分析:Hbase UI中Requests Per Second的具体含义
    ASP.NET Session State Overview
    What is an ISAPI Extension?
    innerxml and outerxml
    postman
    FileZilla文件下载的目录
    how to use webpart container in kentico
    Consider using EXISTS instead of IN
  • 原文地址:https://www.cnblogs.com/kannyi/p/8594592.html
Copyright © 2011-2022 走看看