開啟章節選單

10008 What's Cryptanalysis?

題目敘述

將題目給定的字串中的字母進行加總並排序

輸入說明

  • 輸入的第1列有一個正整數n,代表以下有多少列需要作分析的密文。
  • 接下來的n列,每列含有0或多個字元(可能包含空白字元)

輸出說明

  • 每列包含一個大寫字元(A~Z)和一個正整數。這個正整數代表該字元在輸入中出現的次數。
  • 輸入中大小寫(例如:A及a)視為相同的字元。
  • 輸出時請按照字元出現的次數由大到小排列,如果有2個以上的字元出現次數相同的話,則按照字元的大小(例如:A在H之前)由小到大排列。
  • 如果某一字元未出現在輸入中,那他也不應出現在輸出中。

解題思路

將字母轉成大寫後加總並進行自訂排序

程式碼

#include <bits/stdc++.h>
using namespace std;

// 自訂排序:先依照出現次數遞減,再按字母順序遞增
bool LESS(pair<char, int>& a, pair<char, int>& b) {
    if (a.second != b.second) return a.second > b.second;
    return a.first < b.first;
}

int main() {
    int n;
    cin >> n;
    cin.ignore();  // 吃掉換行符

    map<char, int> mp;  // 統計字母次數

    while (n--) {
        string s;
        getline(cin, s);  // 讀一整行文字

        for (int i = 0; i < s.size(); i++) {
            // 若為小寫則轉為大寫
            if (s[i] >= 'a' && s[i] <= 'z') s[i] = toupper(s[i]);

            // 若為英文字母則統計
            if (s[i] >= 'A' && s[i] <= 'Z') mp[s[i]]++;
        }
    }

    // 將 map 轉為 vector,方便排序
    vector<pair<char, int>> vr(mp.begin(), mp.end());
    sort(vr.begin(), vr.end(), LESS);  // 排序

    // 輸出
    for (int i = 0; i < vr.size(); i++) {
        cout << vr[i].first << ' ' << vr[i].second << endl;
    }
}