D. 序列 (trie)

    传统题 文件IO:trie 1000ms 256MiB

序列 (trie)

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

序列 (trie)

本题使用文件输入输出,请在程序开头加入:

freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);

题目描述

Y 同学获得了一棵包含 N+1N+1 个节点的树,节点编号为 0∼N0 \sim N,其中 00 号节点为根节点。这棵树共有 NN 条边,第 ii 条边连接节点 aia_i 与节点 ii。

Y 同学需要为每条边分配一个低写英文字母('a' 到 'z'),使得该树满足 字典树(Trie) 的性质:对于任意一个节点,其所有出边上的字符互不相同。

在字典树中,每个节点 xx 都代表一个字符串 s(x)s(x)。定义如下:

  • 根节点 00 代表空串。
  • 若节点 uu 是节点 vv 的父节点,且连接 u,vu, v 的边上的字符为 cc,则 s(v)=s(u)+cs(v) = s(u) + c(其中 ++ 表示字符串拼接)。
  • 在合法的字典树中,每个节点代表的字符串是互不相同的。

给定树中 MM 个关键节点的集合 K={k1,k2,…,km}K = \{k_1, k_2, \dots, k_m\}。题目保证树中所有的叶子节点都属于 KK。

令序列 A={s(k1),s(k2),…,s(km)}A = \{s(k_1), s(k_2), \dots, s(k_m)\}。将 AA 中的所有字符串按字典序从小到大排序,得到字符串序列 B={w1,w2,…,wm}B = \{w_1, w_2, \dots, w_m\}。

Y 同学希望通过合理分配每条边上的字符,使得序列 BB 的字典序最小。

序列字典序的比较定义:

  1. 对于两个字符串 PP 和 QQ,其字典序比较方式与标准一致。
  2. 对于两个长度相同的字符串序列 F={f1,f2,…,fm}F = \{f_1, f_2, \dots, f_m\} 和 G={g1,g2,…,gm}G = \{g_1, g_2, \dots, g_m\},若存在整数 1≤t≤m1 \le t \le m,使得对于所有 1≤i<t1 \le i < t 均有 fi=gif_i = g_i,且 ftf_t 的字典序小于 gtg_t,则称序列 FF 的字典序小于序列 GG。

若存在多种分配方案使得序列 BB 的字典序最小,请输出使得边权序列 c1c2…cnc_1 c_2 \dots c_n 字典序最小的方案。其中 cic_i 是连接 aia_i 与 ii 的边上的字符。

输入格式

从 trie.in 文件读入数据。

输入包含多组测试数据。第一行包含一个整数 TT,表示测试数据的组数。

对于每组测试数据: 第一行包含两个整数 NN 和 MM,分别表示除根以外的节点数和关键节点的数量。 第二行包含 NN 个整数 a1,a2,…,ana_1, a_2, \dots, a_n,其中 aia_i 表示节点 ii 的父节点编号。保证每个节点最多有 2626 个子节点。 第三行包含 MM 个整数 k1,k2,…,kmk_1, k_2, \dots, k_m,表示关键节点的编号。保证所有叶子节点均在其中,且关键节点编号各不相同。

输出格式

输出到 trie.out 文件。

对于每组测试数据,输出一行一个长度为 NN 的字符串 c1c2…cnc_1 c_2 \dots c_n,其中 cic_i 表示连接 aia_i 与 ii 的边上的字符。

样例

样例输入 #1

2
5 4
0 1 1 2 2
1 4 3 5
1 1
0
1

样例输出 #1

abaab
a

数据范围与约定

对于 100%100\% 的数据,保证 1≤T≤1031 \le T \le 10^3,1≤M≤N≤2×1051 \le M \le N \le 2 \times 10^5,∑N≤2×105\sum N \le 2 \times 10^5。保证 0≤ai<i0 \le a_i < i,1≤ki≤N1 \le k_i \le N。

测试点编号 分值 N≤N \le 特殊性质
1∼31 \sim 3 15 1010 无
4∼74 \sim 7 20 20002000 特殊性质 A
8∼118 \sim 11 2×1052 \times 10^5 特殊性质 B
12∼1512 \sim 15 15 特殊性质 A
16∼2016 \sim 20 30 无
  • 特殊性质 A:保证树的形态为一条链,即每个节点最多只有一个子节点。
  • 特殊性质 B:保证每个节点最多只有两个子节点。

大样例

点击链接 [bigdata1.in](file://bigdata1.in) 和 [bigdata1.out](file://bigdata1.out) 下载大样例 1 的输入输出数据。

点击链接 [bigdata2.in](file://bigdata2.in) 和 [bigdata2.out](file://bigdata2.out) 下载大样例 2 的输入输出数据。

点击链接 [bigdata3.in](file://bigdata3.in) 和 [bigdata3.out](file://bigdata3.out) 下载大样例 3 的输入输出数据。

点击链接 [bigdata4.in](file://bigdata4.in) 和 [bigdata4.out](file://bigdata4.out) 下载大样例 4 的输入输出数据。