标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30245 Accepted Submission(s):
11434
For 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.".
题目大概意思:有N辆火车,以序列1方式进站,判断是否能以序列2方式出栈。进站不一定是一次性进入,也就是说中途可以出站。
1 /*模拟方法:把序列一入栈,并与序列二的进行比较,判断是否应该后移指针*/ 2 #include<iostream> 3 #include<cstdio> 4 using namespace std; 5 #include<cstring> 6 #include<stack> 7 #define N 10001 8 char str1[N],str2[N]; 9 int n; 10 int k=0,result[N];//储存结果 11 stack<char>sta; 12 int main() 13 { 14 while(scanf("%d%s%s",&n,str1,str2)==3) 15 { 16 int i=0,j=0; 17 k=0;/*别忘了k的初始化*/ 18 while(!sta.empty()) sta.pop(); 19 sta.push(str1[0]);//先把第一个入栈 20 result[++k]=1; 21 while(i<n&&j<n) 22 { 23 // char mm=sta.top();/*不要这样写,如果sta是空,会报错*/ 24 if(!sta.empty()&&sta.top()==str2[j])/*注意要把取栈顶放在后面,语句&&前面的不符合,后面的就不执行了,不会出错*/ 25 { 26 sta.pop(); 27 result[++k]=0;/*出栈即为0*/ 28 j++; 29 } 30 else 31 { 32 ++i;/*不要用i=1,i++放到后面,因为我们判断i==n是结束条件,放在后面i==n时,实际上才到了n-1*/ 33 sta.push(str1[i]); 34 result[++k]=1;/*入栈即为1*/ 35 // 36 } 37 } 38 if(i==n)/*如果正常匹配成功的话,最后一步是i==n-1,j==n,如果匹配失败,最后一步是i==n-1后再++*/ 39 printf("No.\n"); 40 else{ 41 printf("Yes.\n"); 42 for(int i=1;i<=k;++i) 43 if(result[i]) 44 printf("in\n"); 45 else printf("out\n"); 46 47 } 48 printf("FINISH\n"); 49 memset(result,0,sizeof(result)); 50 memset(str1,0,sizeof(str1)); 51 memset(str2,0,sizeof(str2)); 52 53 } 54 return 0; 55 }
标签:
原文地址:http://www.cnblogs.com/c1299401227/p/5482493.html