開啟章節選單

10789 Prime Frequency

題目連結

題目敘述

給定一個只包含英數字元(0-9, A-Z, a-z)的字串,你需要計算所有字元的出現頻率(也就是每個字元出現的次數),並只輸出出現頻率是質數的那些字元。

質數是指只能被 1 和它本身整除的整數,例如:2、3、5、7、11 等等。

輸入格式

  • 第一行是一個整數 T,代表測資的組數,0 < T < 201

  • 接下來的 T 行,每行是一個字串,只包含英數字元,長度為正整數且小於2001

輸出格式

對於每組輸入,輸出一行結果。 這一行應該包含輸出的序號,接著列出那些在輸入字串中出現次數為質數的字元。 這些字元要按照字典序遞增順序排列(即依 ASCII 值從小到大排序)。 詳細格式請參考範例輸入與輸出的對應結果。 如果沒有任何字元的出現頻率是質數,則應輸出 empty。

解題思路

建立一個長度小於 2001 的質數表,用 dict 紀錄字元出現的次數,keys 紀錄字元 ASCII 順序,遍歷 keys 如果 dict[keys] 是質數(prime[dict[keys]] == true),將字元加入 ans,最後若 ans 為空 ans = "empty"

程式碼

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

int main() {
  vector<bool> prime(2001, true);
  prime[0] = false;
  prime[1] = false;
  for (int i = 2; i * i <= 2000; i++) {
    if (prime[i]) {
      for (int j = 2; i * j <= 2000; j++) {
        prime[i * j] = false;
      }
    }
  }
  int t;
  string s, ans;
  map<char, int> dict;
  vector<char> keys;
  cin >> t;
  for (int i = 0; i < t; i++) {
    ans = "";
    dict.clear();
    keys.clear();
    cin >> s;
    for (char c : s) {
      if (dict.find(c) != dict.end()) {
        dict[c]++;
      } else {
        dict[c] = 1;
        keys.push_back(c);
      }
    }
    sort(keys.begin(), keys.end());
    cout << "Case " << i + 1 << ": ";
    for (int j = 0; j < keys.size(); j++) {
      if (prime[dict[keys[j]]]) {
        ans += keys[j];
      }
    }
    if (ans == "") {
      ans = "empty";
    }
    cout << ans << "\n";
  }
}