開啟章節選單

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