#CF2139E2. 枫树与树之美
枫树与树之美
E2枫树与树之美(困难版本)
时间限制: 每测试 秒
内存限制: 每测试 兆字节
这是问题的困难版本。版本之间的区别在于,此版本中 和 的约束更大。只有在你解决了所有版本的问题后,才能进行 hack。
枫树被给定一棵有根树,包含 个顶点,编号从 到 ,其中根节点的索引为 。树的每个顶点被标记为 或 。不幸的是,枫树忘记了顶点的标记方式,只记得恰好有 个 和 个 。
对于每个顶点,我们定义该顶点的名称为从根到该顶点的路径上所有顶点的标记拼接而成的二进制字符串。更形式化地说,,且对于所有 ,有 ,其中 是顶点 的父节点, 表示字符串拼接。
树的美度等于所有叶子节点名称的最长公共子序列的长度。你的任务是:在所有恰好包含 个 和 个 的标记方案中,确定树的最大美度。
输入格式
每个测试包含多个测试用例。第一行包含测试用例的数量 。接下来是每个测试用例的描述。
每个测试用例的第一行包含两个整数 和 — 顶点的数量以及标记为 的顶点数量。
第二行包含 个整数 — 顶点 的父节点。
保证所有测试用例的 之和不超过 。
输出格式
对于每个测试用例,输出一个整数,表示在所有恰好包含 个 和 个 的标记方案中,树的最大美度。
样例
输入
5
7 3
1 1 2 2 3 3
7 2
1 1 2 3 1 1
5 0
1 2 3 4
5 2
1 1 1 1
5 4
1 1 1 1
输出
3
2
5
1
2
输入
5
2 0
1
2 1
1
3 0
1 1
3 1
1 2
3 1
1 1
输出
2
2
2
3
2
样例解释
在第一个测试用例中,最大美度为 ,当顶点标记为 时达到,最长公共子序列为 001。
在第二个测试用例中,最大美度为 ,当顶点标记为 时达到,最长公共子序列为 11。