PAT 구조 및 알고리즘 7-46시나 마이크로 블로깅 화제은 (50 개 라인 합리화 및 테스트 포인트 분석)

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/qq_40946921/article/details/99697472

7-46시나 마이크로 블로깅 화제 (30 점)

시나 마이크로 블로깅은 동일하거나 유사한에 대해 얼마나 많은 사람들이이 말을보고, "#"한 쌍의 사이에 서면 곧 음성 텍스트의 주제, 당신은 주제 링크를 생성 할 수 있습니다, 자신의 연설에서 "항목을"포함 링크를 클릭 할 수 있습니다 항목을 참조하십시오. 시나 마이크로 블로깅 화제 목록은 언제든지 업데이트됩니다, 모두의 관심의 일반 시력에서 가장 인기있는 주제를 권장합니다.

마이크로 블로깅 주제 구문 분석 (중국의 워드 프로세싱이 너무 많은 문제가 있기 때문에)이 항목은 영어의 많은 수에서, 단순화 된 화제의 추천 기능을 달성하는 데 필요한 주제에 가장 마이크로 Boti을 찾을 수 있습니다.

입력 형식 :

입력 설명 : 첫째, N 행 다음에 양의 정수 N (≤10 5), 각 행은 영어 트위터가 아닌 이상 140 자 주어집니다. 최근의 한 쌍에 포함 된 모든 #내용이 입력 보장하기 위해 주제로 간주됩니다 #쌍.

출력 형식 :

제 1 출력 라인은 마이크로 pothi 최대 바, 한 마이크로 블로그 문서의 수를 갖는 제 2 출력 라인을 받는다. 이 주제는 고유하지 않으면 최소의 출력 순으로 주제, 제 3 출력 라인 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 ...

참고 : 

       구분 (착각하기 쉬운이) : "# A B 번호"및 "는 @ & B"주제 "는 B"이다는 생각이 공백으로 대체 특별한 상징, 여러 공간 병합

       공백없이 종료 종료

      

 

#include<iostream>
#include<map>
#include<string>
using namespace std;
struct Topic {
	int n;			//话题出现次数
	bool used = false;	//判断是否在一条微博提到过这个话题
};
int main(){
	int n, count = 0;
	string str;
	char ch;
	pair<string, Topic> hot;		//记录最热话题
	map<string, Topic> result;		//记录所有话题
	cin >> n;
	getchar();
	for (int i = 0; i < n; ++i) {
		while ((ch = getchar()) != '\n') {
			if (ch == '#') {
				str.clear();
				while (true) {
					ch = getchar();
					if (ch == '#' || ch == '\n')
						break;
					else if (isdigit(ch) || isalpha(ch))
						str.push_back(tolower(ch));
					else if (!str.empty() && str.back() != ' ')		//添加分隔符
						str.push_back(' ');
				}
				if (str.back() == ' ')str.pop_back();			//去除尾部空格
				str[0] = toupper(str[0]);						//首字母大写
				if (!result[str].used) {						//话题计数
					result[str].n++;
					result[str].used = true;
					if (result[str].n == hot.second.n) {		//相同更新并列个数
						count++;
						if (str < hot.first)					//根据字符字典序更新最热话题
							hot.first = str;
					}
					else if (result[str].n > hot.second.n) {	//更新最热话题
						count = 0;								//重置并列个数
						hot = { str,result[str] };
					}
				}
			}
		}
		for (auto& it : result)				//重置
			it.second.used = false;
	}
	cout << hot.first << endl << hot.second.n << endl;
	if (count)
		cout << "And " << count << " more ..." << endl;
	return 0;
}

 

추천

출처blog.csdn.net/qq_40946921/article/details/99697472