站外题求解50分
mjc(其实就是我的名字,这个呢不重要)是一位文本编辑,他需要统计一篇文章中每个单词的出现次数,并生成每个单词出现次数的报告。他希望你能帮助他编写一个程序来实现这个任务。
给定一个包含小写英文字母、空格字符、,
、.
组成的字符串,表示一篇文章。单词是由小写英文字母组成(不能为空串,不能不含其它字符),文章中以空格字符、,
、.
隔开每个单词。
你需要统计这篇文章中每种单词的出现次数,并按照单词的出现次数降序排列输出单词,如果出现次数相同时,则按照单词的字典序升序排列输出单词。
输入为一个包含小写英文字母、空格字符、,
、.
组成的字符串,表示待统计的文章。文本总长度不超过 1000 个字符。
输出第一行,一个整数 cnt,表示文章中不同单词的数量。
接下来 cnt 行,每行以空格隔开输出排序后每个单词以及该单词在文章中出现的次数。
this is a test, this is only a test.
5
a 2
is 2
test 2
this 2
only 1
文章中共有 5 种单词,每种单词的出现次数:
this
:2 次;is
:2 次;a
:2 次;test
:2 次;only
:1 次;排序的顺序为:a is test this only
。
#include<bits/stdc++.h>
using namespace std;
map<string,int> a;
bool cmp(pair<string,int> a,pair<string,int> b) {
return a.second>b.second;
}
int main() {
string s;
getline(cin,s);
s+=",";
int len=s.size();
string c;
for(int i=0;i<len;i++) {
if(s[i]>='A' && s[i]<='Z')
s[i]=(char)s[i]-'A'+'a';
if(s[i]!=' ' && s[i]!=',' && s[i]!='.')
c+=s[i];
else {
if(s[i-1]==',' || s[i-1]==' ' || s[i-1]=='.' || i==0)
continue;
a[c]++;
c="";
}
}
cout<<a.size()<<endl;
vector<pair<string,int>> v(a.begin(),a.end());
sort(v.begin(),v.end(),cmp);
for(auto i=v.begin();i!=v.end();i++)
cout<<i->first<<" "<<i->second<<"\n";
return 0;
}
求条必壶关