给定两个长度均为 n 的排列 p,q,要求求出:
在推荐系统中,两名用户分别给出了他们对 n 个项目的兴趣排序。每个用户的排序是一个长度为 n 的序列,恰好包含 1 到 n 每个编号一次。
系统希望生成一个推荐序列,这个序列必须同时是两名用户排序的子序列,且长度尽可能长;在长度最长的前提下,推荐序列的编号在字典序上要尽可能大(即希望优先展示编号较大的项目)。请你来设计这个推荐序列。
【定义】
请你对于给定的两个序列 A 和 B,找出字典序最大的最长共同序列,输出其长度和元素。
数据范围约束:
第一行包含一个整数 T(1≤T≤105),表示测试数据的组数。 接下来每组数据描述如下:
对于每组测试数据,输出两行: 第一行输出一个整数 k,表示最长共同序列的长度。 第二行输出 k 个整数,用空格分隔,表示字典序最大的那个最长共同序列。
输入
1
2
2 1
1 2
输出
1
2
说明
序列 A=[2,1],B=[1,2]。两个序列的最长公共子序列长度只能是 1,因为任意长度为 2 的子序列都无法同时是两个序列的子序列(例如 [2,1] 在 B 中不是子序列,[1,2] 在 A 中不是子序列)。长度为 1 的公共子序列有 [1] 和 [2],其中字典序更大的为 [2],因此输出长度 1 和序列 2。n=2 是题目允许的最小长度,本样例验证了边界情况。
输入
1
4
1 2 3 4
1 3 2 4
输出
3
1 3 4
说明
A=[1,2,3,4],B=[1,3,2,4]。最长公共子序列的长度为 3。长度 3 的公共子序列有两条:[1,2,4] 和 [1,3,4]。在长度相同的前提下需要选择字典序最大的序列。比较第一个不同位置(第 2 个元素):3 大于 2,因此 [1,3,4] 的字典序更大。最终输出长度 3 以及序列 1 3 4。
输入
2
3
1 2 3
2 3 1
5
5 4 3 2 1
1 2 3 4 5
输出
2
2 3
1
5
说明
第一组数据:A=[1,2,3],B=[2,3,1]。最长公共子序列为 [2,3],长度为 2,也是唯一长度为 2 的公共子序列,故答案长度为 2,序列为 2 3。
第二组数据:A=[5,4,3,2,1],B=[1,2,3,4,5]。两个序列互为逆序,不存在长度大于 1 的公共子序列。所有长度为 1 的公共子序列中,最大数字为 5,因此输出长度 1,序列 5。这组数据展示了完全逆序的退化情况。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.