#P2568. Decode the Tree

    ID: 1569 传统题 1000ms 256MiB 尝试: 7 已通过: 1 难度: 10 上传者: 标签>树结构数据结构队列DFS序列Ulm Local 2001

Decode the Tree

中文题面:

描述

给定一棵顶点用整数1,2,...,n1, 2, ..., n编号的树(即无环连通图)。该树的“普鲁弗码”构建方法如下:选取编号最小的叶子节点(即仅关联一条边的顶点),将该叶子节点及其关联的边从图中移除,同时记录与该叶子节点相邻的顶点编号。对剩余的图重复此过程,直至仅剩一个顶点(该顶点编号始终为nn。所记录的n1n-1个编号序列称为该树的普鲁弗码。

你的任务是根据给定的普鲁弗码重构一棵树,并按以下语法规则用字符串表示该树:

T ::= "(" N S ")"
S ::= " " T S | 空
N ::= 数字

也就是说,树的表示由一对括号包裹,括号内首部为表示根节点编号的数字,后跟任意数量(可能为零)的子树,子树之间用单个空格分隔。

例如,样例输出第一行表示的树结构如图所示。更多样例输入可通过问题2567的解法生成。

请注意,根据上述定义,树的根节点也可以是叶子节点。指定根节点仅是为了表示方便,通常我们处理的是“无根树”。

输入:

输入包含多个测试用例。每个测试用例占一行,包含n1n-1个用空格分隔的整数,表示一棵树的普鲁弗码。

输入以EOFEOF结束。可假设1n501 ≤ n ≤ 50

输出:

对每个测试用例,输出一行对应的树结构,格式如上述描述。

注意,此类树可能存在多种合法表示方式,选择其中一种即可。

输入数据1

5 2 5 2 6 2 8
2 3
2 1 6 2 6

输出数据1

(8 (2 (3) (5 (1) (4)) (6 (7))))
(3 (2 (1)))
(6 (1 (4)) (2 (3) (5)))

来源

ACM国际大学生程序设计竞赛(ACM-ICPC) 德国乌尔姆大学分站赛