開啟章節選單
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'; } }