您的位置:首页 > 编程语言 > C语言/C++

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. 输出频数最高的单词(最大堆),频数相同时输出字典序最小的单词(最小堆)

#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 C++ map priority_queue