问题描述
随着新学期的到来,伊格纳修斯火车站现在非常繁忙。许多学生想乘火车回到学校(因为伊格纳修斯火车站的火车是世界上最快的V^)。但问题来了,只有一条铁路,所有的火车都停在那里。所以所有的火车都从一边进来,然后从另一边出来。对于这个问题,如果A列车先进入铁路,然后B列车在A列车离开之前进入铁路,那么A列车在B列离开之前是不能离开的。下面的图片说明了问题的所在。现在的问题是,车站最多有9列火车,所有列车都有一个ID(编号从1到n),火车按O1顺序进入铁路,你的任务是确定火车是否能按O2顺序下车。
输入
输入包含几个测试用例。每个测试用例由一个整数、列车数和两个字符串组成,火车的顺序是:O1,火车的顺序是:O2。输入将在文件结束时终止。示例输入中的更多细节。
输出量
输出包含一个字符串“No”。如果您不能将O2转换为O1,或者您应该输出一条包含“是”的线路,然后输出您在交换订单时的方式(您应该在“输入”一列进入铁路的列车中输出,而“输出”一列从铁路上出来的列车)。在每个测试用例之后打印一行包含“Finish”。示例输出中的更多细节。
样本输入
3 123 321
3 123 312
样本输出
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH
思路
由题目中的图我们可以看出,这是一个入栈出栈基本的操作题
当栈内非空时,我们有两种处理方式
1.将栈顶的元素出栈
2.入栈新元素
题目中的意思并非所有车都进去后,才能有出来的权利
它完全可以边入站边出站
所以说在火车入站时我们都要判断一次看看是否能够符合出站条件
在每次出站之后我们也要判断是否还有符合条件的列车接着出站
在所有火车入站完成后,只能进行出站操作,一个个判断即可
如果能够完成操作的话,还要输出in和out的过程
这个在入站出站过程中用一个数组记录即可
代码
#include<iostream>
#include<stack>
#include<string>
using namespace std;
bool f(int a[],int n, string s1, string s2)
{
int i = 0;
int i1 = 0;
int i2 = 0;
stack<char> s;
while (i1 < n)//入栈直到入站车全部完全进入,中间若符合条件可以出栈
{
s.push(s1[i1++]);
a[i++] = 1;//in
while (!s.empty()&&s.top() == s2[i2])//栈顶车和目标出站车一样则一直出栈
{
i2++;
a[i++] = 0;//out
s.pop();
}
}
while (i2 < n)//一个个出栈验证
{
if (s2[i2++] != s.top())//栈顶车和目标出站车有一个不一样则不符合要求
{
return false;
}
else
{
a[i++] = 0;//out
s.pop();
}
}
return true;
}
int main()
{
int n;
while (cin >> n)
{
int a[10005];//储存in和out in-1 out-0
string s1, s2;
cin >> s1 >> s2;
//按照要求输出即可
if (!f(a, n, s1, s2))
{
cout << "No." << endl << "FINISH" << endl;
}
else
{
cout << "Yes." << endl;
for (int i = 0; i < 2 * n; i++)
{
if (a[i])cout << "in" << endl;
else cout << "out" << endl;
}
cout << "FINISH" << endl;
}
}
return 0;
}