開啟章節選單

10062 Tell me the frequencies!

題目連結

題目敘述

給你一行文字,請你找出其中所有 ASCII 字元出現的次數。
每行輸入都會視為一組獨立的測資。
請注意,輸入字串中不會有 ASCII 前 32 個控制字元,也不會有 128 以上的字元(所以只有 32~127 這一段的 ASCII 字元,且不含結尾的換行符號 \n\r)。

輸入說明

  • 多行文字,每一行都是一筆測資。
  • 每行最多 1000 個字元。
  • 輸入到檔案結束(EOF)為止。

輸出說明

  • 對於每一組輸入,請輸出這一行所有出現過的 ASCII 字元的ASCII 編號及其出現次數。
  • 輸出時:
    1. 先以次數由小到大排序。
    2. 如果次數相同,ASCII 值較大的字元排前面。
  • 每組輸出之間要空一行。
  • 不需輸出多餘的空白行。

解題思路

  1. 統計每個 ASCII 字元出現的次數
  2. 整理出現過的字元及其次數
  3. 依規則排序

程式碼

#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;

int main(){
    string s;
    int cnt = 0;
    while(getline(cin,s)){
        if(cnt)cout<<endl;
        vector<int> vc(1e5,0);
        for(auto c:s)vc[c]+=1;
        vector<pair<int,int>> order;
        for(int i=0;i<1e5;i++){
            if(vc[i]>0){
                order.push_back({vc[i],i});
            }
        }
        sort(begin(order),end(order),[](pair<int,int> a,pair<int,int> b){
            if(a.f!=b.f)return a.f<b.f;
            return a.s>b.s;
        });
        for(auto pr:order){
            cout<<pr.s<<" "<<pr.f<<endl;
        }
        cnt++;
    }
    return 0;
}