http://pat.zju.edu.cn/contests/pat-a-practise/1071
输入字符串,输入最高词频的单词及其频数。
1. char s[1050000], 是4个零... 数组开小了会段错误(数组越界)
2. 输入时需要将大写转换为小写,否则输入sample, 输出的是can 4
3. map<string, int>, 记录单词所对应的频数
4. 输出频数最高的单词(最大堆),频数相同时输出字典序最小的单词(最小堆)
#include <queue> #include <cstdio> #include <string> #include <map> #include <cstring> using namespace std; struct Term { string m_key; int m_cnt; Term(const string& key, int cnt): m_key(key), m_cnt(cnt) {} friend bool operator<(const Term& a, const Term& b) { if (a.m_cnt != b.m_cnt) { return a.m_cnt < b.m_cnt; // 最大堆 } else { return a.m_key > b.m_key; // 最小堆 } } }; char s[1050000]; int len; map<string, int> cnt; priority_queue<Term> q; inline bool in_set(char c) { return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')); } int main() { scanf("%[^\n]", s); len = strlen(s); int begin = 0; for (int i = 0; i < len; ++ i) { if ( s[i] >= 'A' && s[i] <= 'Z' ) { s[i] = s[i] - 'A' + 'a'; } } for (int i = 0; i < len; ++ i) { if ( in_set(s[i]) ) { begin = i; break; } } for (int i = begin + 1; i < len; ++ i) { if ( in_set(s[i]) == false ) { string key(s+begin, i-begin); ++ cnt[key]; begin = -1; // flag for ( ++ i; i < len; ++ i) { if ( in_set(s[i]) ) { begin = i; break; } } } } if (begin != -1) { string key(s+begin); ++ cnt[key]; } for (auto it = cnt.begin(); it != cnt.end(); ++ it) { q.push( Term(it->first, it->second) ); } printf("%s %d\n", q.top().m_key.c_str(), q.top().m_cnt); return 0; }