首页 > 代码库 > 2014 UESTC Training for Data Structures K - 方师傅与栈
2014 UESTC Training for Data Structures K - 方师傅与栈
K - 方师傅与栈
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
方师傅有一个1?N的排列,排列的顺序是固定的,他想要把这个排列重新排列成他喜欢的顺序。
于是他买了一个栈,他会按顺序将排列扔进栈内,在某些时刻将栈顶元素取出,这样出栈后的排列就可以重新排序啦。
例如,原序列是1,2,他先将1入栈,再将2入栈,然后将2出栈,最后将1出栈,那么新序列就变成了2,1。
方师傅很好奇,当前排列能不能通过一个栈变成他想要的排列呢?
Input
输入第1行包含1个数字N,代表方师傅的排列的长度。
接下来1行包含N个整数,代表最开始方师傅的排列。
接下来1行包含N个整数,代表方师傅想要的排列。
N≤1000000
Output
输出包含1个字符串Yes
或者No
,代表方师傅能否成功
Sample input and output
Sample Input | Sample Output |
---|---|
3 3 2 1 1 2 3 | Yes |
4 1 2 3 4 3 1 2 4 | No |
题意:给两个序列问第二个序列B是否能通过第一个序列A通过栈处理得到;
纯模拟,假设有一个栈,如果当前栈顶等于A的开头,就弹出栈顶元素,不然B就继续进栈。直到结束如果栈里没有元素则成功,不然失败。
轻松AC。
#include <iostream> #include<string.h> #include<stdio.h> using namespace std; long long q[1000008],w[1000008],z[1000008]; int main() { int n,j,k,l; memset(w,0,sizeof(w)); scanf("%d",&n); for (j=1;j<=n;j++) scanf("%I64d",&q[j]); for (j=1;j<=n;j++) scanf("%I64d",&w[j]); j=1;k=1;l=0; while (j<=n){ while (q[j]!=w[k] && j<=n) {l++;z[l]=q[j];j++;} while (q[j]==w[k] && j<=n) { j++;k++; } while (w[k]==z[l] && k<=n) {l--;k++;} if (k>n) break; } if (k>n && j>n) printf("Yes\n");else printf("No"); return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。