7-15 新浪微博热门话题

大体思路是字符串按行输出(这里注意getchar()),每一行用set保存话题(便于去重),然后把每一行出现的话题放入map集合中,因为map我不太会排序,转化一下思路,遍历map,将每一个map对转化成pair存入vector数组,这样就可以排序了,然后输出就可以。不过肯定有写细节需要注意了,比如在向集合里存话题时,将非英文字母非数字的字符全部转化为空格,多个空格合并成一个空格,否则就会格式错误。

#include <bits/stdc++.h>
#define INF 1e10
using namespace std;
typedef long long ll;
map<string,int> ma;
map<string,int>::iterator qq;
set<string> s;
set<string>::iterator it;
vector<pair<string,int> > pa;

bool cmp(pair<string,int> a, pair<string,int> b)
{
    if(a.second == b.second)
        return a.first<b.first;
    return a.second > b.second;
}
int main()
{
    int n;
    cin>>n;
    getchar();
    while(n--)
    {
        s.clear();
        int l,l1 = -1,l2 = -1;
        string buf;
        getline(cin,buf);
        l = buf.size();
        char p[150];
        for(int i = 0;i < l;i++)
        {
            //取出话题
            if(buf[i] == '#' && l1 == -1)
            {
                l1 = i;
            }
            else if(buf[i] == '#' && l1 != -1)
                l2 = i;
            if(l2 != -1)
            {
                memset(p,0,sizeof(p));
                //printf("%dgg\t%dgg\n",l1,l2);
                int num = 0;
                for(int j = l1 + 1;j < l2;j++)
                {
                    //cout<<buf[j];
                    if(isalpha(buf[j]) || isdigit(buf[j]))
                    {
                        //cout<<buf[j];
                        if(isupper(buf[j]))
                        {
                            buf[j] = (char)('a' - 'A' + (int)buf[j]);
                            //cout<<buf[j];
                        }
                        //这里注意因为最后输出用一个空格分隔原文中的单词,所以多个空格合并成一个空格
                        if(buf[j-1] == ' ') p[num++] = ' ';
                        p[num++] = buf[j];
                    }
                    else buf[j] = ' ';
                }
                //cout<<p<<endl;
                l1 = l2 = -1;
                s.insert(p);
            }
        }
        for(it = s.begin();it != s.end();it++)
        {
            string q = *it;
            //cout<<q<<endl;
            ma[q]++;
        }
    }
    for(qq = ma.begin();qq != ma.end();qq++)
    {
        pair<string,int> r;
        r.first = qq->first;
        r.second = qq->second;
        pa.push_back(r);
    }
    sort(pa.begin(),pa.end(),cmp);
    int num = pa[0].second;
    string x = pa[0].first;
    x[0] = (char)(x[0] + 'A' - 'a');
    int oth = 0;
    for(int i = 1;i < pa.size();i++)
    {
        if(pa[i].second == num)
          oth++;
    }
    cout<<x<<endl;
    printf("%d\n",num);
    if(oth)
    {
        printf("And %d more ...\n",oth);
    }
    return 0;
}

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值