11233 Deli Deli

題目連結

題目敘述

Deli 經營著一家名為 “Deli Deli” 的熟食店。去年,Deli 決定擴展她的事業並建立一間線上商店。她聘請了一位工程師來完成這個線上商店。

最近,一些新的線上顧客對電子帳單提出了抱怨。程式設計師忘記在一項商品被購買多次的情況下使用複數形式。不幸的是,Deli 的工程師正在度假,現在這項任務就交由你來完成,為 Deli 完成這個功能。

以下是將單字轉為複數形式的說明:

  • 如果該單字在不規則單字列表中,則使用對應的不規則複數形式取代它。

  • 否則,如果該單字以子音字母加上 “y” 結尾,則將 “y” 替換為 “ies”。

  • 否則,如果該單字以 “o”、 “s”、 “ch”、 “sh” 或 “x” 結尾,則在單字尾端加上 “es”。

  • 否則,在單字尾端加上 “s”。

輸入格式

輸入的第一行包含兩個整數 L 和 N(0 ≤ L ≤ 20,1 ≤ N ≤ 100)。接下來的 L 行描述了不規則單字及其複數形式。每一行包含兩個由空格分隔的單字,其中第一個單字是不規則單字的單數形式,第二個單字是其複數形式。

在不規則單字列表之後,接下來的 N 行中,每一行包含一個單字,你需要將它轉換為複數形式。你可以假設每個單字由最多 20 個英文字母小寫字元(‘a’ 到 ‘z’)組成。

輸出格式

輸出共 N 行,第 i 行為第 i 個輸入單字的複數形式。

解題思路

map<string, string> dict 紀錄不規則單字

判斷 :

  • 單字是否在 dict
  • 單字結尾

並輸出

程式碼

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

int main() {
    int L, N;
    cin >> L >> N;
    map<string, string> dict;
    string s, s1;
    for (int i = 0; i < L; i++) {
        cin >> s >> s1;
        dict[s] = s1;
    }
    for (int i = 0; i < N; i++) {
        cin >> s;
        int l = s.size();
        if (dict.count(s) != 0) {
            cout << dict[s];
        } else if (s[l - 1] == 'y' && l >= 2 &&
                   !(s[l - 2] == 'a' || s[l - 2] == 'e' || s[l - 2] == 'i' || s[l - 2] == 'o' || s[l - 2] == 'u')) {
            s[l - 1] = 'i';
            s += "es";
            cout << s;
        } else if (s[l - 1] == 'o' || s[l - 1] == 's' || s[l - 1] == 'x' ||
                   (l >= 2 && s[l - 1] == 'h' && (s[l - 2] == 'c' || s[l - 2] == 's'))) {
            s += "es";
            cout << s;
        } else {
            s += 's';
            cout << s;
        }
        cout << '\n';
    }
}