stl的妙用—词频统计
7-11 词频统计(25 分)
请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前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;
int sum = 0;
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
string s;
char ch;
map<string,int>ss;
vector<int>a;
while((ch = getchar()) != '#')
{
if(isupper(ch)) ch = ch + 32;
else if(!isalnum(ch)&&ch!='_') ch = ' ';
s += ch;
}
string m;
stringstream h(s);
while(h>>m) {
if(m.length() > 15) m.resize(15);
if(ss.count(m)) ss[m]++;
else {ss[m] = 1;sum++;}
}
int num = ss.size();
cout<<num<<endl;
int nnum = num / 10;
map<string,int>::iterator it;
for(it = ss.begin(); it != ss.end(); it++)
{
int m = (*it).second;
a.push_back(m);
}
sort(a.begin(), a.end(), cmp );
for(int i = 0; i < nnum; i++)
{
int m = a[i];
for(it = ss.begin(); it != ss.end(); it++)
{
if((*it).second == m)
{
cout<<m<<":"<<(*it).first<<endl;
(*it).second = 0;
break;
}
}
}
}
能用好stl真的可以实现超级多东西。map真的超级好用
上一篇: 她是宋朝的杨皇后,33岁与皇上姐弟恋
下一篇: 七言诗•长假旅游