1. 程式人生 > >7-15 新浪微博熱門話題

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;
}