PAT 1071. Speech Patterns
2014-04-13 10:48
274 查看
http://pat.zju.edu.cn/contests/pat-a-practise/1071
输入字符串,输入最高词频的单词及其频数。
1. char s[1050000], 是4个零... 数组开小了会段错误(数组越界)
2. 输入时需要将大写转换为小写,否则输入sample, 输出的是can 4
3. map<string, int>, 记录单词所对应的频数
4. 输出频数最高的单词(最大堆),频数相同时输出字典序最小的单词(最小堆)
输入字符串,输入最高词频的单词及其频数。
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; }
相关文章推荐
- PAT 1086. Tree Traversal Again (25)
- PAT乙级练习题B1043. 输出PATest
- PAT-B 1019. 数字黑洞 (20)
- PAT甲级 1047. Student List for Course (25)
- PAT 1021 Deepest Root
- PAT-乙级-1014. 福尔摩斯的约会 (20)
- PAT - 团体程序设计天梯赛-练习集 - L2-006 - 树的遍历
- PAT (Basic Level) Practise (中文)1063. 计算谱半径(20)
- PAT-1030. Travel Plan (30)
- PAT甲级1001. A+B Format(20)
- PAT(乙) 1005.继续(3n+1)猜想 (25)
- PAT - 甲级 - 1039. Course List for Student (25)(STL-vecotr)
- PAT (Basic Level) Practise (中文)1011. A+B和C (15)
- PAT乙级练习题B1051. 复数乘法
- PAT L2-001. 紧急救援
- PAT (Advanced Level) Practise 1001. A+B Format (20)
- PAT1013. 素因子分解(20)
- PAT-乙级-1035. *插入与归并(25)
- PAT L2-008. 最长对称子串(25) (暴力,Manacher算法和DP解决)
- PAT1030