#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main(){
int n;
while (cin >> n)
{
bool flag = false;
char* pin = new char[5*n];
char* pout = new char[5*n];
int* data = new int[5*n];
int k = 0;
cin >> pin;
cin >> pout;
stack<char> car;
for (int i = 0, j = 0; i <=n;)
{
if ( (pin[j] != pout[i]))
{
if (!car.empty() && car.top() == pout[i])
{
i++;
data[k++] = 0;
car.pop();
}
else
{
car.push(pin[j]);
data[k++] = 1;
j++;
}
}
else if ((pin[j] == pout[i]))
{
data[k++] = 1;
data[k++] = 0;
i++;
j++;
}
if ((i >= n && (j >= n) && (car.empty())))
{
flag = true;
break;
}
if ((car.size() >= n) && (pout[i] != car.top())){
flag = false;
break;
}
}
if (flag == true)
{
cout << "Yes." << endl;
for (int i = 0; i < 2 * n; i++)
{
if (data[i] == 1)
cout << "in" << endl;
else
cout << "out" << endl;
}
}
else
cout << "No." << endl;
cout << "FINISH" << endl;
}
return 0;
}
/*
解题过程自我总结:
1:明白这不是简单的字符串的逆序,而是栈的运用。
2:思路类似于有两组火车等待出站,一组位于stack中,一组就是数组中还未进站的队列,通过与给定的此刻需要出站的火车进行比较,选择是哪一组的火车需要出站。
3:一开始只是简单地判定能否按给定顺序出站成功,没有in out标记。后来加上int[] data模拟是进站还是出站操作,值得注意的是,
当条件符合数组中还未进站的火车等于此刻需要出站的火车是,逻辑上是没有让这辆火车push to stack,只是把data[i]=1,data[i+1]=1,即设置成进站再出站。
4:以上过程完成后,是运行超时,明白需要把数组增大。接下来是答案错误,意识到没有注意的问题是,当我入站和出站给定的数字有不同时,即输入 1 1 0,会陷入死循环,
于是我加上了最后的一个if判断,思路即堆栈达到火车数量后,并且栈顶元素仍旧不符合给定的出站火车,那么退出循环,flag=false。
*/