CF168B Wizards and Minimal Spell

传送门:luogucodeforces

题意

给定若干行长度为 \(n\) 的字符串,要求进行以下操作:

  • 若字符串不以 # 开头,则删去所有空格;
  • 若第 \(i\) 行和第 \(i + 1\) 行都不以 # 开头,则将这两行合并为同一行;
  • 若第 \(i\) 行为空行,除非第 \(i - 1\)\(i + 1\) 行都以 # 开头,否则删去此行。

求经过所有操作后的字符串 \(S\)

思路

不是这纯英语体面给谁看的啊!

感谢楼上的翻译和 DeepL 翻译。

纯纯的小模拟。不过模拟的思路楼上已经说过了,来一个别的。

首先介绍一个特殊的流类:stringstream。它允许将字符串作为输入和输出流进行处理。字符串流提供了一种方便的方式,可以将字符串与其他基本类型进行转换、拼接、解析等操作。

于是乎,就可以借助 stringstream 的功能,把用 vector 存储的值转换为 string。然后再对题目要求中的条件分别做判断,分别处理即可。

这里处理的整体思路其实和直接模拟没有太多区别,所以我其实是个标题党

具体细节见代码。

代码

#include <bits/stdc++.h>
using namespace std;
namespace xycyx {
	vector<string> v, res;
	bool isamp(string &str) {
		stringstream ss(str);
		string x;
		ss >> x;
		return (int)x.size() && x[0] == '#';
	}
	void solve() {
		string str;
		while (getline(cin, str))
			v.push_back(str);
		bool flag = 1;
		for (int i = 0; i < (int)v.size(); i++) {
			str = "";
			stringstream ss(v[i]);
			ss >> str;
			if ((int)str.size() && str[0] == '#') {
				res.push_back(v[i]);
				flag = 1;
				continue;
			}
			if ((int)str.size() == 0) {
				string st = (int)res.size() ? res.back() : "#";
				string en = i + 1 < (int)v.size() ? v[i + 1] : "#";
				if (isamp(st) && isamp(en)) res.push_back(str);
				else continue;
			} else {
				string tot = str;
				while (ss >> str) tot += str;
				if (!flag) res[(int)res.size() - 1] += tot;
				else res.push_back(tot);
				flag = 0;
			}
		}
		for (int i = 0; i < (int)res.size(); i++)
			cout << res[i] << "\n";
	}
}
int main() {
	xycyx::solve();
	return 0;
}

在函数 isamp 中,return 的句子等价于:

if ((int)x.size() != 0 && x[0] == '#') return true;
else return false;
posted @ 2024-02-27 20:57  Foiled  阅读(8)  评论(0编辑  收藏  举报