传送门:luogu 和 codeforces。
题意
给定若干行长度为 \(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;
标签:string,int,res,Spell,back,Wizards,str,Minimal,size
From: https://www.cnblogs.com/cloud-evecyx/p/18038322