【中】词频统计 哈希 字符串处理 30分

发布时间:2019年03月16日 阅读:291 次

7-13 词频统计 (30 分)

请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前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;
map<string ,int >oo;
struct node
{
    string bb;
    int ci;
};
int cmp(node a,node b)
{
    if(a.ci!=b.ci)
        return a.ci>b.ci;
    return a.bb<b.bb;
}
int main()
{
    char s[1232];
    int ff  =0;
    while(~scanf("%s",s))
    {
        int n = strlen(s);
        string aa;
        for(int i=0;i<n;i++)
        {
            if(s[i]=='#'){
                ff = 1;
                break;
            }
            if(isalpha(s[i]))
            {
                if(aa.size()<15)
                aa+=tolower(s[i]);
            }
            else if(isalnum(s[i]))
            {
                if(aa.size()<15)
                aa+=s[i];
            }
            else if(s[i]=='_')
            {
            if(aa.size()<15)
                aa+=s[i];
            }
            else{

                    if(aa.size()>0)
           oo[aa]++;
           aa ="";
            }

        }
           if(aa.size()>0)
        oo[aa]++;
        if(ff)break;
    }
    vector<node>k;
    auto it = oo.begin();
    for(;it!=oo.end();it++)
    {
    //cout<<it->first<<endl;
        k.push_back(node{it->first,it->second});
    }
    sort(k.begin(),k.end(),cmp);
    int Size = k.size();
    cout<<Size<<endl;

    for(int i=0;i<Size/10;i++)
    {
        printf("%d:",k[i].ci);
        cout<<k[i].bb<<endl;
    }

}

点评:代码比较复杂 但是只要一步一步挨着做 就没问题
注意isalpha tolower的使用 各种小细节的判断


Tag:
相关文章
发表评论

发表评论: