题目:
D. Unnatural Language Processing
每次测试的时间限制1秒钟
每次测试的内存限制256兆字节
投入标准输入
输出标准输出
露拉觉得很无聊,决定用这五个字母创造一种简单的语言a, b, c, d, e。有两种类型的信件:
元音—信件a和e。他们由以下人员代表V.
辅音—信件b, c,以及d。他们由以下人员代表C.
有两种类型音节在语言中:CV(辅音后跟元音)或CVC(元音前后带辅音)。举个例子,ba, ced, bab是音节,但是aa, eda, baba不是。
A 单词在语言中是一系列音节。Lura在语言中写了一个单词,但她不知道如何将其拆分为音节。帮助她把单词分解成音节。
例如,给定单词bacedbab,它将被拆分成音节,如ba.ced.bab(圆点.代表音节边界)。
投入
输入由多个测试用例组成。第一行包含一个整数t (1≤t≤100)—测试用例的数量。测试用例的描述如下。
每个测试用例的第一行包含一个整数n (1≤n≤2⋅105)—单词的长度。
每个测试用例的第二行包含一个字符串,由n小写拉丁字符—单词。
给出的所有单词都是语言中的有效单词;也就是说,他们只使用字母a, b, c, d, e,每个单词由几个音节组成。
的总和n所有测试案例不超过2⋅105.
输出
对于测试用例,输出一个字符串,表示通过插入一个点将单词分成音节.每对相邻音节之间。
如果有多个可能的分割,输出其中任何一个。输入以这样的方式给出,即至少存在一种可能的分裂。
例子
投入复制
6
8
bacedbab
4
baba
13
daddecabeddad
3
dac
6
dacdac
22
dababbabababbabbababba
输出复制
ba.ced.bab
ba.ba
dad.de.ca.bed.dad
dac
dac.dac
da.bab.ba.ba.bab.bab.ba.bab.ba
思路:
每次遇见V后要看V后面有连着有几个C,如果只有一个C说明是CV结构的,如果有两个C说明是CVC结构的,最后一个单词单独判定。
代码:
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
int main()
{
IOS;
int n;
cin >> n;
while (n--)
{
int t;
cin >> t;
string arr(t+2, 0);//储存字符
string wwr(t+2, 0);//将字符转化为C,V
string ans = "";
for (int i = 0; i < t; i++)
{
cin >> arr[i];
if (arr[i] == 'a' || arr[i] == 'e')
wwr[i] += 'v';
else
wwr[i] += 'c';
}
for (int i = 0; i < t; i++)
{
ans += arr[i];
if (wwr[i] == 'c' && i == t - 3)//判断最后一个单词CVC结构
{
ans += arr[i + 1];
ans += arr[i + 2];
break;
}
else if (wwr[i] == 'c' && i == t - 2)//判断最后一个单词是否为CV结构
{
ans += arr[i + 1];
break;
}
else if (wwr[i] == 'v')
{
if (wwr[i + 2] == 'c')
{
ans += arr[i + 1];
ans += '.';
i++;
}
else
{
ans += '.';
}
}
}
cout << ans << endl;
}
return 0;
}