新浪微博可以在发言中嵌入“话题”,即将发言中的话题文字写在一对“#”之间,就可以生成话题链接,点击链接可以看到有多少人在跟自己讨论相同或者相似的话题。新浪微博还会随时更新热门话题列表,并将最热门的话题放在醒目的位置推荐大家关注。
本题目要求实现一个简化的热门话题推荐功能,从大量英文(因为中文分词处理比较麻烦)微博中解析出话题,找出被最多条微博提到的话题。
输入格式:
输入说明:输入首先给出一个正整数N(≤),随后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 ...
/*
题目描述有错误,长度即使超过40也要全部保存
另外此题中不能用strlwr等类似转换大小写函数
*/
#include <bits/stdc++.h>
using namespace std;
typedef struct Node
{
string key;
int num;
}Node;
bool cmp(Node a, Node b)
{
if(a.num == b.num)
return a.key < b.key;
return a.num > b.num;
}
Node a[100010];
typedef Node *NodePtr;
map<string, int> mp;
set<string>ans, cur;
void solve()
{
int cnt = 0, max_v, key_num = 0;
for(set<string>::iterator it = ans.begin(); it != ans.end(); ++it)
{
a[key_num].key = *it;
a[key_num].num = mp[*it];
key_num++;
}
sort(a, a + key_num, cmp);
max_v = a[0].num;
for(int i = 0; i < key_num; ++i)
{
if(max_v == a[i].num)
cnt++;
else break;
}
a[0].key[0] = 'A' + a[0].key[0] - 'a';
cout << a[0].key << endl;
printf("%d\n", a[0].num);
if(cnt - 1 != 0)
printf("And %d more ...", cnt - 1);
}
int main()
{
set<string>::iterator it;
int n, len;
char input[150];
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
cur.clear();
int p = 0, num = 0;
int pos[150];
char processed[150];
if(i == 1)
getchar();
gets(input);
len = strlen(input);
for(int j = 0; j < len; ++j)
{
if(input[j] == '#' || isalnum(input[j]))
{
if(input[j] == '#')
pos[num++] = p;
if(input[j] >= 'A' && input[j] <= 'Z')
input[j] = 'a' + input[j] - 'A';
processed[p++] = input[j];
}
else
processed[p++] = ' ';
}
processed[p] = '\0';
char key[num / 2 + 1][140];
for(int j, k = j = 0; j < num / 2; ++j, k += 2)
{
int flag = 0;
len = 0;
for(int d = pos[k] + 1; d < pos[k + 1]; d++)
{
if(processed[d] != ' ')
{
key[j][len++] = processed[d];
flag = 1;
}
else
{
if(flag == 1)
{
key[j][len++] = ' ';
}
flag = 0;
}
}
if(key[j][len - 1] == ' ')
len--;
key[j][len] = '\0';
}
for(int j = 0; j < num / 2; ++j)
{
if(key[j][0] != '\0')
cur.insert(key[j]);
ans.insert(key[j]);
}
for(it = cur.begin(); it != cur.end(); ++it)
{
mp[*it]++;
}
}
solve();
}