注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
Description
英语中名词的复数是非常麻烦的东西,由于规则太多,刚上初一dalong一直没有弄清楚。而这个星期的英语作业就是名词的单数变复数,dalong希望你能帮助他来完成这份作业。当然,由于考虑到你可能也忘记了这些麻烦的规则,他特意百度了相应的规则:
名词复数的构成方法
(1) 在一般情况下,加词尾 -s:book / books 书 pen / pens 钢笔 face / faces 脸
(2) 在通常情况下,以 s, x, z, sh, ch 等结尾的名词,通常加词尾 -es:bus/buses 公共汽车
(3) 复合名词的复数形式通常是将其主要名词变为复数 passer-by / passers-by 过路人
(4) 其它特殊的不规则复数名词:man/men 男人
事实上名词复数变化远不像上面描述的这样简单,只是由于dalong刚上初一,因此只学了简单的规则,dalong事先会告诉你一些他所学到的不规则名词,而你可以认为除了这些不规则名词复数外其它的都是规则的,也就是它们满足规则1,2,3中的任一个,如果是复合名词,那么它的主要名词是单词中字母数较多的一个,相同时是第一个(主要名词的判断是dalong的发明,可能与实际情况不符,你只需要按照他的判断来做即可),如果主要名词是不规则的,那么就变成不规则的复数形式。
Input
单组测试数据
输入的第一部分有若干行,是dalong给你的不规则名词表,每一行包含两个个英语单词,单词间用空格隔开,第一个单词表示名词的单数,后一个是复数。这一部分最后一行是#,表示输入结束,这个#不是单词表中的单词。
输入的第二部分也有若干行,每一行是一个英文名词的单数,如果这个单词没有出现在单词表中,那么你可以认为它是规则的。输入的最后也是用#表示结束。
注意:单词表中的单词不会超过20000个,第二部分中的询问不会超过30000个。单词长度不会超过20。复合名词只会包含两个单词。
Output
对于输入第二部分的每一个名词单数,你需要给出它相应的复数形式。如果这个单词在不规则单词表中出现过,你需要输出单词表中给出的相应复数形式,否则按1,2,3中任一规则输出复数形式。
Sample Input
woman women
man men
child children
fish fish
tooth teeth
ox oxen
#
book
bus
passer-by
fish
box
ox
woman-maker
#
Sample Output
books
buses
passers-by
fish
boxes
oxen
women-maker
Source
英语中名词的复数是非常麻烦的东西,由于规则太多,刚上初一dalong一直没有弄清楚。而这个星期的英语作业就是名词的单数变复数,dalong希望你能帮助他来完成这份作业。当然,由于考虑到你可能也忘记了这些麻烦的规则,他特意百度了相应的规则:
名词复数的构成方法
(1) 在一般情况下,加词尾 -s:book / books 书 pen / pens 钢笔 face / faces 脸
(2) 在通常情况下,以 s, x, z, sh, ch 等结尾的名词,通常加词尾 -es:bus/buses 公共汽车
(3) 复合名词的复数形式通常是将其主要名词变为复数 passer-by / passers-by 过路人
(4) 其它特殊的不规则复数名词:man/men 男人
事实上名词复数变化远不像上面描述的这样简单,只是由于dalong刚上初一,因此只学了简单的规则,dalong事先会告诉你一些他所学到的不规则名词,而你可以认为除了这些不规则名词复数外其它的都是规则的,也就是它们满足规则1,2,3中的任一个,如果是复合名词,那么它的主要名词是单词中字母数较多的一个,相同时是第一个(主要名词的判断是dalong的发明,可能与实际情况不符,你只需要按照他的判断来做即可),如果主要名词是不规则的,那么就变成不规则的复数形式。
Input
单组测试数据
输入的第一部分有若干行,是dalong给你的不规则名词表,每一行包含两个个英语单词,单词间用空格隔开,第一个单词表示名词的单数,后一个是复数。这一部分最后一行是#,表示输入结束,这个#不是单词表中的单词。
输入的第二部分也有若干行,每一行是一个英文名词的单数,如果这个单词没有出现在单词表中,那么你可以认为它是规则的。输入的最后也是用#表示结束。
注意:单词表中的单词不会超过20000个,第二部分中的询问不会超过30000个。单词长度不会超过20。复合名词只会包含两个单词。
Output
对于输入第二部分的每一个名词单数,你需要给出它相应的复数形式。如果这个单词在不规则单词表中出现过,你需要输出单词表中给出的相应复数形式,否则按1,2,3中任一规则输出复数形式。
Sample Input
woman women
man men
child children
fish fish
tooth teeth
ox oxen
#
book
bus
passer-by
fish
box
ox
woman-maker
#
Sample Output
books
buses
passers-by
fish
boxes
oxen
women-maker
Source
模拟题,注意超时。
#include <iostream>
#include <string>
#include <map>
using namespace std;
void normal_change(string str)
{
int len = str.length();
if (str[len-1] == 'z' || str[len-1] == 's' || str[len-1] == 'x')
cout << str << "es";
else if (str[len-1] == 'h' && (str[len-2] == 's' || str[len-2] == 'c'))
cout << str << "es";
else
cout << str << "s";
}
int main()
{
map<string, string> M;
map<string, string>::iterator pos;
string A, B;
string temp, sub1, sub2;
int in_len, s_len;
while (1)
{
cin >> A;
if (A == "#")
break;
cin >> B;
M.insert(make_pair(A, B));
}
cin >> temp;
while (temp != "#")
{
sub1 = sub2 = "\0";
in_len = temp.length();
for (s_len = 0; s_len < in_len; s_len++)
if (temp[s_len] == '-')
break;
if (s_len != in_len)
{
sub1 = temp.substr(0, s_len);
sub2 = temp.substr(s_len+1, in_len-s_len-1);
if (s_len >= in_len/2)
{
pos = M.find(sub1);
if (pos != M.end())
cout << pos->second;
else
normal_change(sub1);
cout << "-" << sub2;
}
else
{
cout << sub1 << "-";
pos = M.find(sub2);
if (pos != M.end())
cout << pos->second;
else
normal_change(sub2);
}
}
else
{
pos = M.find(temp);
if (pos != M.end())
cout << pos->second;
else
normal_change(temp);
}
cout << endl;
cin >> temp;
}
// system("pause");
}