#P3023. 「NOIP2008」双栈排序

「NOIP2008」双栈排序

Description

Tom最近在研究一个有趣的排序问题。通过 22个栈 S1S1S2S2 ,Tom希望借助以下 44 种操作实现将输入序列升序排序。

若图片失效请下载附加文件

操作 aa

如果输入序列不为空,将第一个元素压入栈 S1S1

操作 bb

如果栈 S1S1 不为空,将 S1S1 栈顶元素弹出至输出序列

操作 cc

如果输入序列不为空,将第一个元素压入栈 S2S2

操作 dd

如果栈 S2S2 不为空,将 S2S2 栈顶元素弹出至输出序列

如果一个 11 ~ nn 的排列 PP 可以通过一系列操作使得输出序列为 12(n1)n1,2,…,(n-1),n ,Tom就称 PP 是一个“可双栈排序排列”。例如 (1,3,2,4)(1,3,2,4) 就是一个“可双栈排序序列”,而 (2,3,4,1)(2,3,4,1) 不是。下图描述了一个将 (1,3,2,4)(1,3,2,4) 排序的操作序列: <a,c,c,b,a,d,d,b><a,c,c,b,a,d,d,b>

若图片失效请下载附加文件

当然,这样的操作序列有可能有几个,对于上例 (1,3,2,4)(1,3,2,4)<a,b,a,a,b,b,a,b><a,b,a,a,b,b,a,b> 是另外一个可行的操作序列。Tom希望知道其中字典序最小的操作序列是什么。

Input Format

输入文件 twostack.intwostack.in 的第一行是一个整数 nn

第二行有 nn 个用空格隔开的正整数,构成一个 11 ~ nn 的排列。

Output Format

输出文件 twostack.outtwostack.out 共一行,如果输入的排列不是“可双栈排序排列”,输出数字 00

否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。

Sample

twostack1.in

4
1 3 2 4

twostack1.out

a b a a b b a b

twostack2.in

4
2 3 4 1

twostack2.out

0

twostack3.in

3
2 3 1

twostack3.out

a c a b b d

Hint

30%30\% 的数据满足: n10n\leq10

50%50\% 的数据满足: n50n\leq50

100%100\% 的数据满足: n1,000n\leq1,000