UVa 492 Pig-Latin
·
题目描述
题目要求将输入文本中的每个单词转换为 Pig Latin\texttt{Pig Latin}Pig Latin。单词定义为连续的字母序列(不区分大小写)。转换规则如下:
- 若单词以元音字母(a,e,i,o,u\texttt{a,e,i,o,u}a,e,i,o,u 及其大写形式)开头,则在单词末尾添加
ay。 - 若单词以辅音字母开头,则将第一个字母移到单词末尾,再添加
ay。 - 非字母字符(如空格、标点等)原样输出,不进行转换。
输入格式
输入包含多行文本。每行包含任意数量的字符。输入以文件结束符(EOF\texttt{EOF}EOF)终止。
输出格式
输出转换后的文本,保持原空格和标点位置不变。
样例
输入
This is the input.
输出
hisTay isay hetay inputay.
题目分析
本题的核心是逐字符处理输入,识别单词并应用转换规则。
算法步骤
- 逐字符读取输入。
- 若当前字符是字母,则将其加入当前单词缓冲区。
- 若当前字符不是字母:
- 若缓冲区非空,则对缓冲区中的单词进行转换并输出。
- 输出当前非字母字符。
- 清空缓冲区。
- 处理完所有字符后,若缓冲区非空,则输出最后转换的单词。
转换规则
- 判断首字母是否为元音(不区分大小写):
- 若是,输出原单词后加
ay。 - 若不是,输出原单词去掉首字母后的部分,然后输出首字母,最后加
ay。
- 若是,输出原单词后加
- 注意保持原单词的大小写:首字母移动后应保持原有大小写?规则中说明“不改变任何字母的大小写”,因此移动后的首字母应保持原样输出(如样例中
This变为hisTay,首字母T被移到最后仍为大写)。
复杂度分析
每个字符处理一次,时间复杂度 O(L)O(L)O(L)。
代码实现
// Pig-Latin
// UVa ID: 492
// Verdict: Accepted
// Submission Date: 2026-07-08
// UVa Run Time: 0.000s
//
// 版权所有(C)2026,邱秋。metaphysis # yeah dot net
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char *argv[]) {
ios::sync_with_stdio(false);
cin.unsetf(ios::skipws);
char input;
string block;
while (cin >> input) {
if (isalpha(input)) block += input;
else {
if (block.length() > 0) {
char vowel = tolower(block.front());
if (vowel == 'a' || vowel == 'e' || vowel == 'i' || vowel == 'o' || vowel == 'u') cout << block << "ay";
else {
char front = block.front();
block.erase(block.begin());
cout << block << front << "ay";
}
}
cout << input;
block.clear();
}
}
return 0;
}
更多推荐




所有评论(0)