题目描述
假设杭州东火车站只有一条铁路,并且所有火车都从一侧进来,从另一侧出去。那么,如果火车A先进站,然后火车B在火车A离开之前就进站,那么火车A直到火车B离开后才能离开,可参见下图。
现在,假设车站中有n(n<=9)列火车,所有火车都有一个ID(从1到n的编号),火车以O1的顺序进站,您的任务是确定火车是否可以按O2顺序出站。
输入
输入包含几个测试用例。
每个测试用例均包含三部分:一个表示火车数量的整数和两个字符串O1和O2,其中,火车的进站顺序用O1串表示,火车的出站顺序用O2串表示。
输入在文件末尾终止,更多信息参见样例。
输出
如果不能从O1的入站顺序得到O2的出站顺序,请输出字符串“ No.”。
如果能够得到,则请输出"Yes."
然后输出进站和出站的具体方式(“in”表示火车进站,“out”表示火车出站)。
在每个测试用例之后输出一行“ FINISH”。
更多信息参见样例。
样例输入 Copy
3 123 321 3 123 312
样例输出 Copy
Yes. in in in out out out FINISH No. FINISH
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
int train_number;
while (cin >> train_number) {
string o1, o2;
cin >> o1 >> o2;
queue<char> q1, q2;
stack<char> st;
vector<string> v;
for (int i = 0; i < train_number; i++) {
q1.push(o1[i]);
q2.push(o2[i]);
}
while (q1.empty() == false) {
if (st.empty() == false && st.top() == q2.front()) {
v.push_back("out");
st.pop();
q2.pop();
continue;
}
char ch = q1.front();
if (ch == q2.front()) {
q1.pop();
q2.pop();
v.push_back("in");
v.push_back("out");
}
else {
v.push_back("in");
st.push(ch);
q1.pop();
}
}
while (st.empty() == false && st.top() == q2.front()) {
st.pop();
q2.pop();
v.push_back("out");
}
if (st.empty() == false) {
cout << "No." << endl;
}
else {
cout << "Yes." << endl;
int len = v.size();
for (int i = 0; i < len; i++) {
cout << v[i] << endl;
}
}
cout << "FINISH" << endl;
}
return 0;
}