同題: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