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;
    }
    
    
  • 相关阅读:
    How to Compile Java DBus
    BZOJ 2783 JLOI 2012 树 乘+二分法
    Robotium原则的实施源代码分析
    基本的负载均衡算法
    人大、上财、复旦、上交四校2013年应届金融硕士就业去向
    2014届上财金融硕士就业情况
    三跨),总分420+
    复旦金融专硕和上财金融专硕
    一个三跨考生三战上海财经大学金融硕士的考研经验
    董某某
  • 原文地址:https://www.cnblogs.com/kannyi/p/8594592.html
Copyright © 2011-2022 走看看