题目描述
火车站只有一条铁路,所有的火车都停在那里。所以所有的火车都是从一边进站,从另一边出站。如果A列先进入铁路,然后B列在A列离开之前进入铁路,那么A列在B列离开之前不能离开。下图说明了问题所在。车站里最多有9列火车,所有的火车都有一个ID(编号从1到N),火车按照O1的顺序进入火车,火车是否可以按照O2的顺序驶出。
输入
输入包含几个测试用例。
每个测试用例由一个整数(列车数)和两个字符串组成。两个字符串分别为列车入站顺序和列车出站顺序。
输出
如果不能按照指定顺序出站,输出“No”。
如果可以,输出“Yes”,然后输出出入站顺序(对于进入铁路的列车,应输出“in”,对于出铁路的列车,应输出“out”)。在每个测试用例之后打印一行包含“FINISH”。
输入样例1
3
3 123 321
3 abc cab
3 123 123
输出样例1
Yes
in
in
in
out
out
out
FINISH
No
FINISH
Yes
in
out
in
out
in
out
FINISH
#include<iostream>
#include<stack>
#include<vector>//类似于数组,比数组好的是,不需要初始化
#include<cstring>
using namespace std;
int main() {
int t;
int len;
string inword,outword;//进来的和出去的字符
cin >> t;
while (t--) {
cin >> len >> inword >> outword;
stack<char>s;
vector<string>show;//显示输出样例in out,也可以选择用stack,但是要正序输出,需要两个堆栈,所以考虑用vector
int p1 = 0, p2 = 0;//标志位,遍历in和out的word
while (p2 != len) {//只要p2没有遍历到长度,就是没有完全出完
while (p1 < len && inword[p1] != outword[p2]) {//没有完全入完,并且进来的和出去的顺序不一致,就只能进入
s.push(inword[p1++]);//把当前位加入s里面
show.push_back("in");//并告知容器,此时为进入
}
if (p1 == len) {//走到了len,说明p1+++++到了len,竟然不是因为in=out跳出的循环,说明没救了!不可能相等。
break;
}
if (inword[p1] == outword[p2]) {//刚进来就能出去,跳出上面一个while;一般情况下都能走到这一步。
p1++;
p2++;//比较他们的下一位
show.push_back("in");
show.push_back("out");//说明他们来过且出去了
}
while (!s.empty() && s.top() == outword[p2]) {//当栈里面还有火车,并且栈顶就是目标要出去的
show.push_back("out");//让他出去
s.pop();//栈指向下一位
p2++;//p2也指向下一个
}
}
if (s.empty() && p2 == len) {//栈内的火车都出去了,并且走到了最后一个要出栈的位置
cout << "Yes" << endl;//说明此时出栈成功
for (int i = 0; i < show.size(); i++) {
cout << show[i] << endl;//输出in,out
}
}
else {
cout << "No" << endl;
}
cout << "FINISH" << endl;
}
}