PAT 1071. Speech Patterns

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;
}


你可能感兴趣的:(C++,map,堆,priority_queue,pat)