開啟章節選單

10420 List of Conquests

題目連結

題目敘述

在第一幕中,Leporello 向 Donna Elvira 展示他主人的漫長愛情名單:

「這是我主子曾愛過的美女名單,我親自整理的名單:看看吧,跟我一起讀。在義大利有六百四十位,在德國二百三十一位,在法國一百位,在土耳其九十一位;但在西班牙,已經有一千零三位!其中有鄉村少女、女僕、都市美女;有伯爵夫人、男爵夫人、侯爵夫人、公主:各種階級、各種身材、各種年齡的女人。」

——《親愛的小姐,這是目錄(Madamina, il catalogo questo)》

Leporello 依照時間順序記錄 Don Giovanni 曾愛過的每位女子。然而,每次向別人展示這份名單時,他總得一再地統計每個國家的女子人數,這實在太麻煩了
你要幫助 Leporello 統計出他主子 Don Giovanni 在每個國家愛過多少位女子

輸入說明

輸入最多包含 2000 行

  • 第一行是一個整數 n,表示接下來有 n 行資料
  • 接下來的 n 行,每行最多 75 個字元,格式為:
    • 「國家名稱(單一單字)」 + 「女子全名(可能包含空格)」
      你可以假設所有的「國家名稱」都是一個單字,且不包含空白

輸出說明

輸出若干行,每行包含一個國家與 Don Giovanni 在該國愛過的女子人數,格式如下:

國家名稱 女子人數

各行須依國家名稱的字母順序輸出

解題思路

利用 unordered_mapset 這兩個容器來記錄國家對應的數量和出現幾個國家(因為是set所以會依照字母序排列),以及利用 stringstream 可以切割空白的特性,因為是紀錄國家對應的數量,所以後面人名不重要,切割第一次也就是切到國家就好

程式碼

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    cin.ignore();
    unordered_map<string,int> mp;
    set<string> st;
    string s;
    for(int i=0;i<n;i++){
        getline(cin,s);
        stringstream ss(s);
        string S;
        while(ss>>S){
            mp[S]+=1;
            st.insert(S);
            break;
        }
    }
    for(auto K:st){
        cout<<K<<" "<<mp[K]<<endl;
    }
    return 0;
}