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

新浪微博可以在发言中嵌入“话题”,即将发言中的话题文字写在一对“#”之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话题。新浪微博还会随时更新热门话题列表,并将最热门的话题放在醒目的位置推荐大家关注。

本题目要求实现一个简化的热门话题推荐功能,从大量英文(因为中文分词处理比较麻烦)微博中解析出话题,找出被最多条微博提到的话题。
输入格式:

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

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

思路
从测试案例来说,判断共同话题的时候应该是要忽略大小写、忽略标点符号的,可是,在输出的时后又要输出按字母序最小的话题,也就是说必须保留输入话题的原样(至少那个可能要被输出的话题要保留原样)。同5-44一般,我想试试哈希表,将每一个读入的话题放进去,对于相似话题直接合并并比较更新其为字母序最小的话题。
最后再做输出的时候就要遍历整个哈希表,找到题目要求的那些东西。
*需要验证的问题#PA#和#P A#算不算同一个话题
【180127】我理解错了。这道题没我想的那么复杂。他只要每读入一个话题,直接将话题格式化(转化为首字母大写,其他字母小写,除了数字都转化为空格,多个连续的空格自动合并成一个,前导后续空格也省略掉)。然后建一个双索引哈希散列(使用哈希散列是为了便于查找插入;另外使用一个数组是为了便于最后遍历话题统计信息时用)【其实一般包含哈希散列的C头文件、Java库之类的标准库所提供的散列函数本身就包含了这个功能】。

点击访问 PTA-测验

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define MAXLENTH 1000007
/*提交时间  状态  分数  题目  编译器 耗时  用户
2018/1/27 14:12:56  答案正确    30  7-46    C (gcc) 195 ms  569985011
测试点 提示  结果  耗时  内存
0   sample 并列热门;同一微博重复提到的话题只算1次 答案正确    2 ms    144KB
1   一个话题    答案正确    2 ms    128KB
2   分词不同,算2个不同的话题;同一微博可包含多个话题   答案正确    1 ms    128KB
3   最大N;最长微博;最长话题   答案正确    195 ms  1168KB*/
typedef struct node *Node;
struct node {char* KTitle;//整理后的话题int Times;//提到次数int LastTimeWhoPost;//最近一次提及它的是哪条微博(用于去重)
};
void Scan(int);
int HashKey(char*);
int Mod(int);
void Insert(int,char*);Node Hash[MAXLENTH];//散列存储
Node Titles[MAXLENTH]; // 建立双索引
int SumofTitles=0;//话题总数int main() {int n;scanf("%d",&n);getchar();for(int i=0; i<n; i++) {Scan(i);}Node MostTimes=Titles[0];int NumofMost=0;for(int i=1; i<SumofTitles; i++) {
//      printf("{%s--%d}",Titles[i]->KTitle,Titles[i]->Times);if(Titles[i]->Times>MostTimes->Times) {MostTimes=Titles[i];NumofMost=0;} else if(Titles[i]->Times==MostTimes->Times) {if(strcmp(Titles[i]->KTitle,MostTimes->KTitle)<0) {MostTimes=Titles[i];}++NumofMost;}}if(MostTimes->KTitle[0]>='a'&&MostTimes->KTitle[0]<='z')MostTimes->KTitle[0]+='A'-'a';printf("%s\n%d",MostTimes->KTitle,MostTimes->Times);if(NumofMost) {printf("\nAnd %d more ...",NumofMost);}return 0;
}
void Scan(int NumofWeibo) {char temp[141];//每行给出一条英文微博,其长度不超过140个字符
//  getchar();gets(temp);int Flag_Jin=0;char title[141];int Flag_Space=1;
//  printf("{S-%s}\n",temp);for(char*i=temp,*j=title; *i!='\0'; i++) {if(Flag_Jin==1) {switch(*i) {case '#':while(*(j-1)==' ')--j;*j='\0';if(strlen(title)>0)//两个连续的#是空话题,不予计数 Insert(NumofWeibo,title);Flag_Jin=0;                 j=title;break;case 'a'...'z':case '0'...'9':*j++=*i;Flag_Space=0;break;case 'A'...'Z':*j++=*i-'A'+'a';Flag_Space=0;break;default:if(Flag_Space==0) {*j++=' ';Flag_Space=1;}break;}} else if(*i=='#') {Flag_Jin=1;Flag_Space=1;}}
}
int HashKey(char*K) {
//  printf("&");unsigned int n=0;while(*K) {n+=*K-'a';n<<=5;
//      printf("(%d)",n);K++;}
//  printf("*-*");return n;
}
int Mod(int n) {while(n<0)n+=MAXLENTH;return n%MAXLENTH;
}
void Insert(int NumofWeibo,char*t) {//比较后插入散列表并更新话题原型
//  printf("{I-%s}",t);int Key=HashKey(t);int i=0,j=0;for( ; i<=MAXLENTH/2; i++) {j=Mod(Key+i);if(Hash[j]) {if(strcmp(t,Hash[j]->KTitle)==0) {if(Hash[j]->LastTimeWhoPost==NumofWeibo)return;++Hash[j]->Times;Hash[j]->LastTimeWhoPost=NumofWeibo;
//              printf("{add:%s}",Hash[j]->KTitle);}} else break;j=Mod(Key-i);if(Hash[j]) {if(strcmp(t,Hash[j]->KTitle)==0) {if(Hash[j]->LastTimeWhoPost==NumofWeibo)return;++Hash[j]->Times;Hash[j]->LastTimeWhoPost=NumofWeibo;
//              printf("{add:%s}",Hash[j]->KTitle);}} else break;}if(i>MAXLENTH/2) {
//      printf("NOT ENOUGH SPACE");exit(1);}Hash[j]=(Node)malloc(sizeof(struct node));Hash[j]->KTitle=(char*)malloc(strlen(t));strcpy(Hash[j]->KTitle,t);Hash[j]->Times=1;Hash[j]->LastTimeWhoPost=NumofWeibo;Titles[SumofTitles++]=Hash[j];//把新加入的元素在哈希表中的地址保存进数组。方便遍历。
//  printf("{new:%s}",Hash[j]->KTitle);
}

5-46 新浪微博热门话题 (30分)相关推荐

  1. 数据结构PTA习题:进阶实验5-3.2 新浪微博热门话题 (30分)

    进阶实验5-3.2 新浪微博热门话题 (30分) 新浪微博可以在发言中嵌入"话题",即将发言中的话题文字写在一对"#"之间,就可以生成话题链接,点击链接可以看到 ...

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

    1 #include<iostream> 2 #include <map> 3 #include <string> 4 #include <cstring&g ...

  3. 7-46 新浪微博热门话题 (30 分)(思路+详解+set + map)pta逐个点过的 来呀兄弟们

    一 :题目 新浪微博可以在发言中嵌入"话题",即将发言中的话题文字写在一对"#"之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话题 ...

  4. PAT结构与算法7-46 新浪微博热门话题 (50行精简 测试点分析)

    7-46 新浪微博热门话题 (30 分) 新浪微博可以在发言中嵌入"话题",即将发言中的话题文字写在一对"#"之间,就可以生成话题链接,点击链接可以看到有多少人 ...

  5. 数据结构PTA 进阶实验5-3.2 新浪微博热门话题

    进阶实验5-3.2 新浪微博热门话题 题目 解法 题目 新浪微博可以在发言中嵌入"话题",即将发言中的话题文字写在一对"#"之间,就可以生成话题链接,点击链接可 ...

  6. 7-46 新浪微博热门话题(字符串)

    题目链接:7-46 新浪微博热门话题 考查知识:字符串 题意描述: 给定n条微博,每条微博里有若干话题,试统计被最多条微博提到的话题. 思路简析: 首先对#号位置进行记录,然后用a.substr(开始 ...

  7. 7-46 新浪微博热门话题

    ➳ENTRY 新浪微博可以在发言中嵌入"话题",即将发言中的话题文字写在一对"#"之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话 ...

  8. python爬取新浪微博热门话题保存到excel等文件

    第一步 在网页上登录新浪微博,获取登录cookie 先把它复制好先,进行第二步 第二步 废话不多说,直接上代码,把刚刚复制好的值,赋给co变量 # -*- coding: utf-8 -*- &quo ...

  9. PTA新浪微博热门话题(题面毒瘤)

    这道题的题目描述非常容易让人误解 测试点1容易过掉 一般没有问题 测试点2会出现k等于0的情况 这个时候最后一行是不输出的(题目没有写清楚) 测试点3容易出现PE 实际上是中间的处理过程存在问题 这里 ...

最新文章

  1. mac 下 mamp 配置虚拟主机步骤
  2. [Android]《Android艺术开发探索》第一章读书笔记
  3. 推荐一位互联网领域的达人,可以工作、生活、写书三不误!
  4. 使用Pocsuite3
  5. 设计模式[3] -单例模式-代码
  6. java异常及错误处理大纲
  7. 3月初的日记:网站工作记录
  8. php pg_fetch_row,pg_fetch_row
  9. Python——四大内置高阶函数(map、reduce、filter、sorted)
  10. Skype for Business Server 2015-13-IISARR-2-发布-2-前端服务器
  11. android安卓Sqlite数据库实现用户登录注册
  12. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(七)
  13. 游戏筑基开发之C语言编程技巧
  14. ios控件 UIViewController
  15. 何如添加到将文章添加到首页
  16. 算法分析与设计——分治法实验报告
  17. PE格式文件修复过程
  18. 身心灵觉醒视频汇总【建议收藏】
  19. OAuth2授权原理
  20. 图像双立方插值——C实现

热门文章

  1. 传统企业数字化转型方案
  2. live2d实现看板娘达到交互效果
  3. 使用U盘win10家庭版本系统重装
  4. IPFS何时落地应用?FIL价值破千?
  5. 冰蝎v4.0已经更新,在Java18下也能启动冰蝎。
  6. hudi概念与设计介绍
  7. PLC中ST编程的计数器
  8. sqlzoo刷题笔记-02 | SUM and COUNT
  9. 解决STM32虚拟U盘枚举过慢的问题
  10. JS正则——将字符串中的逗号替换成空格