ZeroJudge E706: Cool Word

同題:UVa 12820 – Cool Word

「word」的定義是一串小寫字母組成的單詞。
「cool word」的定義是此單詞至少包含2個不同的字母每個不同字母的出現次數皆不相同

正式的定義如下:
令 w 為一個「word」,S 為 w 中的字母集合,令 f(c) 表示w中c出現的次數(c 皆在 S 集合範圍內)。
當所有 f(c) 皆不相同時,w為一個「cool word」。

例如:”ada”為一個”cool word”,因為 f(a) = 2,f(d) = 1,並且字母不相同。
“banana”也為一個”cool word”,因為f(a) = 3,f(n) = 2,f(b) = 1。
“bbacccd”不是一個”cool word”,因為f(a) = f(d) = 1。
其他一些”cool word”包括:mammal, needed, papaya, referee, senselessness。

請你讀取單詞列表並且計算「cool word」的數量

範例測資

範例輸入範例輸出
輸入包含多組測資。
每組測資第一行為一個整數 N (1 ≤ N ≤ 10000),代表單詞列表長度。
接下來 N 行,每行包含一個單詞,該單詞包含至少 1 個且最多 30 個字母。
對於每組測資,輸出測資 Case 編號以及「cool word」的數量。
2
ada
bbacccd
2
illness
a
Case 1: 1
Case 2: 0

解題思路

宣告一個 Map<char, int>MAP 來紀錄每一個字元出現的次數

宣告一個 Map<int, vector<char>>ans,跑 for (auto it:MAP),將每一個字元依照他出現的次數 Push_Back 到 ans 中

跑 for(auto it:ans),如果有 it.second.size() > 1 的情況就代表這個字不是 cool word。

需要注意如果字串中只出現一種字元不算是 cool word

範例程式碼-ZeroJudge E706: Cool Word

#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N, count = 1;
    while (cin >> N)
    {
        int coolWord = 0;
        for (int i = 0; i<N; i++)
        {
            string str;
            cin >> str;
            map<char, int>MAP;
            for (int j = 0; j<str.length(); j++)
            {
                MAP[str[j]]++;
            }
            map<int, vector<char>>ans;
            int word = 0;
            for (auto it:MAP)
            {
                ans[it.second].push_back(it.first);
                word++;
            }
            if (word == 1) continue;
            bool cool = true;
            for (auto it:ans)
            {
                if (it.second.size() > 1)
                {
                    cool = false;
                    break;
                }
            }
            if (cool) coolWord++;
        }
        cout << "Case " << count << ": " << coolWord << "\n";
        count++;
    }
}

//ZeroJudge E706
//Dr. SeanXD

發佈留言