高端题,在下不行
随着新学期的到来,伊格那丢斯火车站现在非常繁忙。很多学生想坐火车回学校(因为伊格那丢火车站的火车是世界上最快的)。但问题来了,只有一条铁路所有的火车都停在那里。所以所有的火车都是从一边进站,从另一边出站。对于这个问题,如果A列先进入铁路,然后B列在A列离开之前进入铁路,那么A列在B列离开之前不能离开。下图说明了问题所在。现在你的问题是,车站里最多有9列火车,所有的火车都有一个ID(编号从1到N),火车按照O1的顺序进入火车,你的任务是确定火车是否可以按照O2的顺序驶出。
Input
输入 输入包含几个测试用例。每个测试用例由一个整数、列车数和两个字符串组成,列车的顺序为:o1,列车的顺序为:o2。输入被文件结尾终止。在示例输入中提供更多详细信息。
Output
产量 输出包含一个字符串“否”。如果不能将O2交换为O1,或者应该输出一个包含“是”的行,然后输出交换顺序的方式(对于进入铁路的列车,应输出“in”,对于出铁路的列车,应输出“out”)。在每个测试用例之后打印一行包含“finish”。示例输出中的更多详细信息。
Sample Input
3 123 321
3 123 312
Sample Output
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH
对于第一个样本输入,我们让第1列进入,然后让第2列和第3列进入。
所以现在3号列车在铁路的顶部,所以3号列车可以先离开,然后2号列车和1号列车。
在第二个样本输入中,我们应该让3号列车先离开,所以我们必须让1号列车进入,然后让2号列车和3号列车进入。
现在我们可以让3次列车离开了。
但是在那之后,我们不能让1号列车先于2号列车离开,因为2号列车现在在铁路的顶端。
所以我们输出“no.”。
Hint
Hint
//////////////////////////////////
题目大概是这个样子的,就是说有火车,先进后出,典型的栈,用stack来做。这个题需要遍历两次,第一次是判断能否成功,第二次是输出进出顺序。
//////////////////
奉上AC代码
//////////////////////////////////////////////////////////
#include<stdio.h>
#include<iostream>
#include<stack>
#include<vector>
#include<map>
#include<string.h>
#include<set>
#include<algorithm>
#include<list>
#include<queue>
#include<string>
using namespace std;
int main()
{
int n, i, j;
string s1, s2;
while (scanf("%d", &n) != EOF)
{
i = j = 0;
cin >> s1 >> s2;
stack<char>o1, o2;
for (; i < s1.length(); i++)
{
o1.push(s1[i]);
while (o1.top() == s2[j])
{
o1.pop();
j++;
if (o1.empty())
break;
}
}
if (j == s2.length())
cout << "Yes." << endl;
else
{
cout << "No.\nFINISH" << endl;
continue;
}
i = j = 0;
for (; i < s1.length(); i++)
{
o1.push(s1[i]);
printf("in\n");
while (o1.top() == s2[j])
{
o1.pop();
j++;
cout << "out" << endl;
if (o1.empty())
break;
}
}
cout << "FINISH" << endl;
}
return 0;
}
/////////////////////
感悟:遇到自己不会做的题,不要慌张,因为你越慌越做不出来!!! 反正我是绝望了!!!