#P2556. 「CTSC2018」字典树

「CTSC2018」字典树

题目描述

Access Globe 有若干个递增的正整数序列。他把这些正整数序列中的每个正整数的十进制表示(无前导零)依次写了下来,相邻两个整数之间用逗号 , 隔开。Access Globe 把这个序列视为一个由 090 − 9 的数字和逗号 , 组成的字符串,然后用一棵 Trie 树存储这些字符串。你并不需要知道 Trie 树究竟是什么,你只需要知道,Access Globe 得到的 Trie 是一棵以 0 号节点为根的有根树,每条边上都有一个字符,并且从根到每个叶节点的路径上的边上的字符顺次拼接构成的字符串是一个他写下的一个递增的正整数序列。

可爱的小 Tommy 决定篡改这棵 Trie 树。他先将 Trie 上的一些边上的字符删去,然后填上另一些字符。为了不被发现,Tommy 必须保证修改后的 Trie 仍然满足上述性质,即从根到每个叶节点的路径上的边上的字符顺次拼接构成的字符串是一个递增的、由逗号分隔的正整数序列,且每个正整数无前导零

现在 Tommy 已经删去了一些边上的字符,请你帮他完成「填上字符」的操作。如果有多解,请输出字典序最小的解。

输入格式

输入文件包含多组数据,整个文件的第一行是一个整数 TT,表示数据组数。对于每一组数据:

第一行包含一个长度为 nn 的、仅包含 0099,? 的字符串,第 ii 个整数表示连接节点 ii 的父亲和节点 ii 的边上的字符,? 表示这条边上的字符已经被删去; 第二行包含 nn 个整数,第 ii 个整数表示节点 ii 的父亲节点 fif_i,保证 0fi<i0 \le f_i < i

输出格式

输出 TT 行。对于每组数据,输出一个长度为 nn 的字符串,表示字典序最小的填写问号的方式中每个点的字符,第 ii 个整数表示节点 ii 的字符。

如果不存在任何合法的填写方式,请输出 failed

1
2,?3,2?71?4420?2641?
0 1 2 3 4 5 6 7 8 6 10 7 4 4 14 3 2 1 1 0
2,13,207104420026411

数据范围与提示

对于 20%20\% 的数据,T10T \le 10,对于每组数据 n80n \le 80? 个数不超过 88

对于另外 10%10\% 的数据,T20T \le 20,对于每组数据 n80n \le 80fi=i1f_i = i − 1

对于另外 20%20\% 的数据,fi=i1f_i = i − 1

对于另外 10%10\% 的数据,n80n \le 80

对于所有数据,T100T \le 100,对于每组数据 n200n \le 200