树的遍历
题号:NC21581
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld

题目描述

def order(v, mode):
    if v == None:
        return []
    if mode == "pre":
       return [v.label] + order(v.left, s[0]) + order(v.right, s[1])
    if mode == "in":
       return order(v.left, s[2]) + [v.label] + order(v.right, s[3])
    if mode == "post":
       return order(v.left, s[4]) + order(v.right, s[5]) + [v.label]
 
定义如上二叉树遍历的伪代码,pre表示先序遍历,in表示中序列遍历,post表示后序遍历
{s[0],s[2],s[4]}与{s[1], s[3], s[5]}  中 都恰好包含"pre","in","post"  
现在告诉你三个数组以及字符串数组s[]
a1[] = order(root, "pre")
a2[] = order(root, "in")
a3[] = order(root, "post")
问你是否存在一颗二叉树满足按照如上方式调用order函数之后产生a1[],a2[],a3[]
a1,a2,a3的长度相同,且不超过50

输入描述:

第一行输入6个字符串s[0]->s[5]

第二行输入一个整数n(1 ≤ n ≤ 50)

接下来三行每行n个整数表示a1,a2,a3数组

输出描述:

如果存在,输出"Possible"否则输出"Impossible"
示例1

输入

复制
pre pre in in post post
4
1 2 3 4
2 4 3 1
4 3 2 1

输出

复制
Possible
示例2

输入

复制
post in pre post in pre
5
1 2 3 4 5
2 1 3 4 5
1 4 3 5 2

输出

复制
Impossible

说明

样例二解释:从a1看出根是1,从a3看出根是2,矛盾
示例3

输入

复制
in post post pre pre in 
10
10 4 9 2 6 1 5 8 7 3 
5 9 1 4 6 2 7 8 10 3 
8 1 9 4 5 2 6 7 3 10 

输出

复制
Impossible

备注:

子任务一:n<=5

子任务二: n<=10

子任务三:n<=50