3 123 321 3 123 312
Yes. in in in out out out FINISH No. FINISHFor the first Sample Input, we let train 1 get in, then train 2 and train 3. So now train 3 is at the top of the railway, so train 3 can leave first, then train 2 and train 1. In the second Sample input, we should let train 3 leave first, so we have to let train 1 get in, then train 2 and train 3. Now we can let train 3 leave. But after that we can't let train 1 leave before train 2, because train 2 is at the top of the railway at the moment. So we output "No.".HintHint
Ignatius.L
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022
题意:或者站只有一条铁轨,问火车是否可以按前面的序列进站后是否可以按后面的序列出站.
栈模拟:
#include<iostream> #include<stack> #define maxn 100 using namespace std; int main() { stack<char>s; int n,i,j,k; bool result[maxn];//result数组用来表示结果,1表示进栈。0表示出 char in[maxn],out[maxn];//序列1和序列2 while(cin>>n>>in>>out) { j=0,i=0,k=1; s.push(in[0]);//为防止栈空,压一个进去 result[0]=1;//记录进来了一个。 while(i<n&&j<n) { if(!s.empty()&&s.top()==out[j]) { //如果栈顶元素与序列2当前的元素相等,则弹栈,序列2集团向后移一位。 j++; s.pop(); result[k++]=0; } else { //否则从序列1中取当前元素压入栈中。 s.push(in[++i]); result[k++]=1; } } if(i==n)//如果I==N表示栈顶元素不等于序列2当前元素,且序列1中元素都已经入过栈,判断不能得到序列2一样的答案。 cout<<"No."<<endl; else { cout<<"Yes."<<endl; for(i=0; i<k; i++) if(result[i]) cout<<"in"<<endl; else cout<<"out"<<endl; } cout<<"FINISH"<<endl; } return 0; }
#include <iostream> #include <stack> #include <cstdio> #include <cstring> using namespace std; stack<int> S; int main() { int n,i,j,k; bool flag[10000]; string in,out; while(~scanf("%d%*c",&n)) { cin >> in >> out; i = j = k = 0; while(j<n+1 && i<n) { if(!S.empty() && S.top() == out[i]) { i++; flag[k] = true; k++; S.pop(); } else { S.push(in[j]); flag[k] = false; j++; k++; } } cout<<k<<endl; if(k!=2*n) { cout << "No." << endl; } else { cout << "Yes." << endl; for(i = 0; i<k; i++) { if(flag[i]) cout << "out" << endl; else cout << "in" << endl; } } cout << "FINISH" << endl; } return 0; }
# include<stdio.h> # include<string.h> int main() { int n,i,j,k,head; char a[1000],b[1000],t[1000],str[1000][10]; while(scanf("%d%s%s",&n,a,b)!=EOF) { head=i=j=k=0; strcpy(str[k++],"in"); while(i<n) { t[head]=a[i]; while(t[head]==b[j]&&b[j]!='\0'&&t[head]!='\0') { head--; j++; strcpy(str[k++],"out"); } head++; strcpy(str[k++],"in"); i++; } if(head==0) { printf("Yes.\n"); for(i=0; i<k-1; i++) printf("%s\n",str[i]); printf("FINISH\n"); } else { printf("No.\n"); printf("FINISH\n"); } } return 0; }