CF858C 题解

发布时间 2023-07-29 09:52:50作者: So_noSlack

洛谷链接&CF 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

给你一个均为小写字母的字符串,如果它的子串同时满足:

  1. 三个连着的辅音字母。

  2. 这一段连着的辅音字母不是全部一样的。

就认为它不合法。

现在要求用最少的空格隔开这个字符串,使得它变成合法的。

思路

首先定义记录当前位置是否是元音字母的数组 \(a\),并维护它,如下:

for(int i = 0; i < n; i ++) {
		bool flag = false;
		for(int j = 0; j < 5; j ++) 
			if(str[i] == c[j]) flag = true;
		a[i] = flag;
	}

接着直接根据题目要求模拟即可,定义 \(num\) 记录当前连续辅音字母的个数,当这个个数 \(\ge 3\) 之后输出空格即可,这里需要注意:需要先输出空格再输出字母!

经过以上分析及代码片段,很容易即可写出代码了:

#include<iostream>
using namespace std;

char c[10] = {'a', 'e', 'i', 'o', 'u'}; // 元音字母数组
string str;
bool a[3005]; // 记录是否是元音字母

int main(){
	cin >> str;
	int n = str.length();
  	// 预处理 a 数组
	for(int i = 0; i < n; i ++) {
		bool flag = false;
		for(int j = 0; j < 5; j ++) 
			if(str[i] == c[j]) flag = true;
		a[i] = flag;
	}
	int num = !a[0]; // 初始化 num
	cout << str[0]; // 先输出第一个字母
	for(int i = 1; i < n; i ++) {
  		// 如果是辅音字母
		if(!a[i]) {
			num ++; // 增加计数
			if(num >= 3 && !(str[i - 2] == str[i] && str[i - 1] == str[i])) {
				cout << ' '; // 满足条件输出空格
				num = 1; // num 初始化
			}
		}
		else num = 0; // 元音字母
		cout << str[i]; // 正常输出
	}
	return 0;
}

提交记录

\[\text{The End!} \]