新浪微博可以在發言中嵌入“話題”,即將發言中的話題文字寫在一對“#”之間,就可以生成話題鏈接,點擊鏈接可以看到有多少人在跟自己討論相同或者相似的話題。新浪微博還會隨時更新熱門話題列表,並將最熱門的話題放在醒目的位置推薦大家關注。
本題目要求實現一個簡化的熱門話題推薦功能,從大量英文(因為中文分詞處理比較麻煩)微博中解析出話題,找出被最多條微博提到的話題。
輸入格式:
輸入說明:輸入首先給出一個正整數N(≤105),隨后N行,每行給出一條英文微博,其長度不超過140個字符。任何包含在一對最近的#中的內容均被認為是一個話題,如果長度超過40個字符,則只保留前40個字符。輸入保證#成對出現。
輸出格式:
第一行輸出被最多條微博提到的話題,第二行輸出其被提到的微博條數。如果這樣的話題不唯一,則輸出按字母序最小的話題,並在第三行輸出And k more ...,其中k是另外幾條熱門話題的條數。輸入保證至少存在一條話題。
注意:兩條話題被認為是相同的,如果在去掉所有非英文字母和數字的符號、並忽略大小寫區別后,它們是相同的字符串;同時它們有完全相同的分詞。輸出時除首字母大寫外,只保留小寫英文字母和數字,並用一個空格分隔原文中的單詞。
輸入樣例:
4
This is a #test of topic#.
Another #Test of topic.#
This is a #Hot# #Hot# topic
Another #hot!# #Hot# topic
輸出樣例:
Hot 2 And 1 more ...
剛開始沒有思路,網上了解了一下題意后,感覺這題不難,代碼:
#include<iostream> #include<map> #include<cstdio> #include<vector> #include<cstring> #include<algorithm> #include<cctype> using namespace std; string trans(string s){ string ss; for(int i=0;i<s.size();i++){ if(s[i]>='A'&&s[i]<='Z')s[i]=tolower(s[i]); else if(s[i]>='a'&&s[i]<='z'||s[i]>='0'&&s[i]<='9')s[i]=s[i]; else s[i]=' '; } if(s[0]==' ')for(int i=1;i<s.size();i++) ss.push_back(s[i]); else if(s[(s.size()-1)]==' ')for(int i=0;i<s.size()-1;i++)ss.push_back(s[i]); else ss=s; return ss; } int main(){ int n; char st[1000]; vector<int> v; map<string ,int > flag; map<string ,int > m; cin>>n;getchar(); for(int i=0;i<n;i++){ flag.clear(); gets(st); string s=st; v.clear(); for(int i=0;s[i];i++){ if(s[i]=='#') v.push_back(i); } while(v.size()){ int a=v.front(); v.erase(v.begin()); int b=v.front(); v.erase(v.begin()); string s1=s.substr(a+1,b-a-1); string s2= trans(s1);//cout<<endl<<s2<<"$$$$$$$$"<<endl; s2[0]=toupper(s2[0]); if(!flag[s2]){ m[s2]++; flag[s2]=1; } } } int cnt=0; int maxn=0; string topic; map<string ,int >::iterator it; for(it= m.begin();it!=m.end();it++){ string key=it->first; int value = it->second; // cout<<"##########value"<<value<<" key"<<key<<endl; if(value>maxn){ maxn=value; cnt=0; topic=key; } else if(value==maxn)cnt++; } cout<<topic<<endl<<maxn<<endl; if(cnt) cout << "And " << cnt << " more ..." << endl; return 0; }
