ZeroJudge E268: Deli Deli

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

發佈留言