PTA:7-46 新浪微博热门话题 (30 分)

7-46 新浪微博热门话题 (30 分)

新浪微博可以在发言中嵌入“话题”,即将发言中的话题文字写在一对“#”之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话题。新浪微博还会随时更新热门话题列表,并将最热门的话题放在醒目的位置推荐大家关注。
本题目要求实现一个简化的热门话题推荐功能,从大量英文(因为中文分词处理比较麻烦)微博中解析出话题,找出被最多条微博提到的话题。
输入格式:

输入说明:输入首先给出一个正整数N(≤10​的5次方​​ ),随后N行,每行给出一条英文微博,其长度不超过140个字符。任何包含在一对最近的#中的内容均被认为是一个话题,输入保证#成对出现。
输出格式:

第一行输出被最多条微博提到的话题,第二行输出其被提到的微博条数。如果这样的话题不唯一,则输出按字母序最小的话题,并在第三行输出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 ...

代码思路见注释

//建立一个结构体,针对每行输入进行处理,一个字符串保存辨识id,一个字符串保存输出的话题
//一个int保存该话题被提到了多少次 ,利用map辨别当前的topic有没有已经输入过,如果已经输入过则跳过
//每一次换行,用m.clear()清空map中的映射
//最开始理解错题意了,所以使用了两个字符串,实际结构体中的两个字符串是一样的 
#include
#include
#include
#include
#include
#include
#include//需要使用vector存储topic 
using namespace std;
struct topic{
	char id[200];
	char outp[200];
	int cnt;
};
vector v;
map m;//每一条微博里所记录该topic是否出现过,若出现过则不处理直接跳过。 
map ms;//总的记录topic是否出现过,若未出现过,加入其中,出现过则cnt+1; 
bool cmp(topic a,topic b){//用来对topic的热度进行排序的规则 
	int apos=0;int bpos=0;
	if(a.cnt==b.cnt){
		while(a.id[apos]==b.id[bpos]){
			apos++;bpos++;
		}
		return a.id[apos]b.cnt;
}
int main(){
	char tmp[200];
	int N;
	scanf("%d",&N);
	getchar();
	for(int i=0;i='A'&&tmp[j]<='Z'){//其实一个就行了 
						sv1[size1++]=tmp[j]-'A'+'a';
						sv2[size2++]=tmp[j]-'A'+'a';
						flag=false;
						flag1=false;
					}
					else if(tmp[j]>='a'&&tmp[j]<='z'){
						sv1[size1++]=tmp[j];
						sv2[size2++]=tmp[j];
						flag=false;
						flag1=false;
					}
					else if(tmp[j]>='0'&&tmp[j]<='9'){
						sv2[size2++]=tmp[j];
						flag=false;
						sv1[size1++]=tmp[j];
						flag1=false;
					}
					else{
						if(!flag&&size2!=0){
							sv2[size2++]=' ';
							flag=true;
						}
						if(!flag1&&size1!=0){
							sv1[size1++]=' ';
							flag1=true;
						}
					}
					j++;
				}
				if(sv1[size1-1]==' ')
					sv1[size1-1]='\0';
				else
					sv1[size1]='\0';//人工置字符串结束标记 
				if(sv2[size2-1]==' ')
					sv2[size2-1]='\0';
				else
					sv2[size2]='\0';
//				int k=0;
//				while(1){
//					if(sv2[k]>='a'&&sv2[k]<='z')
//						break;
//					k++;
//				}
//				sv2[k]=sv2[k]-'a'+'A';
				if(sv2[0]>='a'&&sv2[0]<='z')
					sv2[0]=sv2[0]-'a'+'A';
//				printf("%s   %s\n",sv1,sv2);
				h1=sv1;h2=sv2;
				if(m.find(h1)==m.end()){//在当前微博中是否出现过这个话题
					if(ms.find(h1)==ms.end()){//在总的微博中是否出现过这个话题 
						strcpy(t1.id,sv1);strcpy(t1.outp,sv2);
//						t1.id=h1;t1.outp=h2;
						t1.cnt=1;
						v.push_back(t1);
						m[h1]=v.size()-1;
						ms[h1]=v.size()-1;
					} 
					else{
						m[h1]=ms[h1];
						v[ms[h1]].cnt++;
					}
				}
			}
		}
	}
	sort(v.begin(),v.end(),cmp);
//	cout<

你可能感兴趣的:(PTA)