#include <iostream>
#include <stack>
#include <vector>
#include <sstream>
using namespace std;
int main() {
string line;
// 循环读取每一行输入,直到文件末尾
while (getline(cin, line)) {
stringstream ss(line);
int n;
string o1, o2;
// 从输入行中解析出火车数量n和进出顺序字符串o1, o2
ss >> n >> o1 >> o2;
vector<int> inOrder(n), outOrder(n);
// 将进出顺序字符串转换为整数数组
for (int i = 0; i < n; ++i) {
inOrder[i] = o1[i] - '0';
outOrder[i] = o2[i] - '0';
}
stack<int> railway;
vector<string> result;
bool possible = true;
int inIndex = 0, outIndex = 0;
// 模拟火车进出过程
while (inIndex < n) {
railway.push(inOrder[inIndex]);
result.push_back("in");
++inIndex;
// 当栈顶火车与出栈顺序匹配时,将其出栈
while (!railway.empty() && railway.top() == outOrder[outIndex]) {
railway.pop();
result.push_back("out");
++outIndex;
}
}
// 如果所有火车都按照指定顺序出栈,则标记为可能
if (outIndex != n) {
possible = false;
}
// 输出结果
if (possible) {
cout << "Yes." << endl;
for (const string& r : result) {
cout << r << endl;
}
}
else {
cout << "No." << endl;
}
cout << "FINISH" << endl;
}
return 0;
}
代码解析:
- 使用
getline
函数循环读取每一行输入,直到文件末尾。 - 使用
stringstream
对象ss
来解析每一行输入,提取出火车数量n
和进出顺序字符串o1
,o2
。 - 将进出顺序字符串转换为整数数组
inOrder
和outOrder
,以便后续处理。 - 使用栈
railway
来模拟火车的进出过程,以及一个字符串向量result
来记录每一步操作("in"表示火车进站,"out"表示火车出站)。 - 使用
while
循环模拟火车的进出过程,直到所有火车都进站为止。 - 在每次循环中,首先将当前火车进站,并将其记录到
result
中。 - 然后检查栈顶火车是否与出栈顺序匹配,如果匹配则将其出栈,并记录到
result
中。 - 循环结束后,检查是否所有火车都按照指定顺序出栈,如果是则标记为可能,否则标记为不可能。
- 根据可能与否输出结果,并打印"FINISH"表示当前测试用例处理完毕。