题目大意
有一个长度为 nnn 序列 xxx,xxx 是个排列。你可以通过一次变换操作,得到一个新的序列,将序列中任意一个数,移动到 xxx 的头部。
题意分析
给你 kkk 个序列,是否能找到 xxx 序列,使得这 kkk 个序列由 xxx 得到。
解题思路
假设现在有个序列为 2,3,4,1,52,3,4,1,52,3,4,1,5。
我变换两个序列出来 3,2,4,1,53,2,4,1,53,2,4,1,5,4,2,3,1,54,2,3,1,54,2,3,1,5。
我们可以发现虽然变化后,除去头部,333 的位置一定在 4,1,54,1,54,1,5 的前面,444 的位置一定在 1,51,51,5 的前面,111 的位置一定在 555 的前面。也就是说去除头部后,后面元素的相对位置是不变的。
对于顺序关系,我们很容易想到拓扑排序,我们去除序列的头部,依次建边,如果存在有向无环图则说明后面部分的相对顺序全部正确,反之错误。
时间复杂度分析
拓扑排序的复杂度为:O(V+E)O(V + E)O(V+E),其中 VVV 表示图中顶点的个数,EEE 表示图中边的数量。
代码演示