同題:UVa 11233 – Deli Deli
Deli 太太經營著熟食店「Deli Deli」。
就在去年,Deli 太太決定擴大她的業務,建立在線商店,並且聘請了一位工程師負責線上商店。
最近,她的新的客戶一直抱怨電子帳單有錯誤。工程師忘記顧客購買多項商品時,商品需要使用複數形式。
不幸的是 Deli 太太聘請的工程師正在休假,因此你的任務是為 Deli 太太實現此功能。
以下為複數形式的輸出說明:
若單字的複數形態屬於沒有規則的類型,請從表格輸出對應的複數型 (表格會事先給定)。
否則,若單字以子音字母接「y」結尾,請以「ies」取代「y」。
否則,若單字以「o」、「s」、「ch」、「sh」、「x」結尾,請在字尾多加上「es」。
否則,請直接在字尾加上「s」。
範例測資
範例輸入 | 範例輸出 |
---|---|
輸入的第一行包含兩個整數 L 和 N (0 ≤ L ≤ 20、1 ≤ N ≤ 100) 接下來 L 行包含對不規則單詞的描述及其複數形式。 每行包含兩個用空格字符分隔的單詞,其中第一個單詞為單數,第二個單詞為複數。 在不規則單詞列表之後,接下來 N 行,每行包含一個單詞。 每個單詞最多包含 20 個小寫字母 (A~Z)。 | 對於每行單詞,輸出單詞的複數形式。 |
3 7 rice rice spaghetti spaghetti octopus octopi rice lobster spaghetti strawberry octopus peach turkey | rice lobsters spaghetti strawberries octopi peaches turkeys |
解題思路
使用 Map 來紀錄特殊的複數,如果裡面沒有紀錄有複數的話 Map 會回傳空的字串 (“”)。
如果沒有事先宣告單字的複數型態的話就按照上面的規則去判定。
範例程式碼-ZeroJudge E268: Deli Deli
#include <iostream>
#include <map>
using namespace std;
bool vowel (char ch)
{
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') return true;
return false;
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int L, N;
cin >> L >> N;
map<string, string>MAP;
for (int i = 0; i<L; i++)
{
string a, b;
cin >> a >> b;
MAP[a] = b;
}
for (int i = 0; i<N; i++)
{
string str;
cin >> str;
char last = str[str.length()-1];
if (MAP[str] != "") str = MAP[str];
else if (last == 'y' && !vowel(str[str.length()-2]))
{
str[str.length()-1] = 'i';
str += "es";
}
else if (last == 'o' || last == 's' || last == 'x') str += "es";
else if (last == 'h' && (str[str.length()-2] == 'c' || str[str.length()-2] == 's')) str += "es";
else str += "s";
cout << str << "\n";
}
}
//ZeroJudge E268
//Dr. SeanXD