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

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

输入格式:

输入说明:输入首先给出一个正整数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();

}