进阶实验5-3.2 新浪微博热门话题 (30 分)
这题首先得看懂题目,最需要注意的就是每个单词之间要有空格,也就是题目说的分词。这里我还是喜欢用map,map大法好啊,我们每次存入单词的时候把其他的字符转化成一个空格一起存入就好了,然后用map计数。PS:首尾的空格记得去掉。
#include<iostream>
#include<string>
#include<map>
#include<set>
using namespace std;
map<string,int> m;
int main()
{
int n,ans=0;
cin>>n;
getchar();
while(n--)
{
set<string> s;
int ret=0,f=0,f1=0; // ret记录#的个数,f是判断话题是否开始,f1是判断空格是否已经添加
string a,b;
getline(cin,a);
for(int i=0;i<a.length();++i)
{
if(a[i]=='#'){
ret++;
if(ret==2){
b.erase(0,b.find_first_not_of(" ")); //去掉开头的空格
b.erase(b.find_last_not_of(" ")+1); //去掉末尾的空格
if(s.count(b)==0){
s.insert(b);
m[b]++;
ans=max(ans,m[b]); //记录最多被提到的微博条数
}
b="",ret=0,f=0;
}
f=1;
continue;
}
if(f){ //话题开始
if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'||a[i]>='0'&&a[i]<='9'){
if(a[i]>='A'&&a[i]<='Z') //转化成小写
a[i]=a[i]+32;
b+=a[i];
f1=0;
}
else{ //其它字符变成空格
if(f1==0) //空格是否已经添加
b+=" ";
f1=1;
}
}
}
}
int ret=0,f=0;
map<string,int>::iterator it;
for(it=m.begin();it!=m.end();it++){
if(it->second==ans){
ret++;
if(f==0){
string a=it->first;
a[0]=a[0]-32;
cout<<a<<endl;
cout<<ans<<endl;
}
f=1;
}
}
if(ret>1)
cout<<"And "<<ret-1<<" more ...";
}