CF1382A Common Subsequence
题目描述
给定两个整数数组 $a_1,\ldots,a_n$ 和 $b_1,\ldots,b_m$。
你的任务是找到一个非空数组 $c_1,\ldots,c_k$,它既是 $a_1,\ldots,a_n$ 的子序列,也是 $b_1,\ldots,b_m$ 的子序列。如果有多个答案,要求输出长度最小的一个。如果长度最小的答案也有多个,输出任意一个即可。如果不存在这样的数组,需要输出相应的信息。
一个序列 $a$ 是序列 $b$ 的子序列,当且仅当 $a$ 可以通过从 $b$ 中删除若干(可能为零)元素得到。例如,$[3,1]$ 是 $[3,2,1]$ 和 $[4,3,1]$ 的子序列,但不是 $[1,3,3,7]$ 和 $[3,10,4]$ 的子序列。
输入格式
第一行包含一个整数 $t$($1\le t\le 1000$),表示测试用例的数量。接下来的 $3t$ 行描述每个测试用例。
每个测试用例的第一行包含两个整数 $n$ 和 $m$($1\le n,m\le 1000$),分别表示两个数组的长度。
第二行包含 $n$ 个整数 $a_1,\ldots,a_n$($1\le a_i\le 1000$),表示第一个数组的元素。
第三行包含 $m$ 个整数 $b_1,\ldots,b_m$($1\le b_i\le 1000$),表示第二个数组的元素。
保证所有测试用例中 $n$ 的总和与 $m$ 的总和不超过 $1000$($\sum\limits_{i=1}^t n_i, \sum\limits_{i=1}^t m_i\le 1000$)。
输出格式
对于每个测试用例,如果存在解,输出 "YES";否则输出 "NO"。
如果输出 "YES",下一行输出一个整数 $k$($1\le k\le 1000$),表示数组的长度,接着输出 $k$ 个整数 $c_1,\ldots,c_k$,表示该数组的元素。
如果有多个长度最小的解,输出任意一个即可。
说明/提示
在第一个测试用例中,$[4]$ 是 $[10, 8, 6, 4]$ 和 $[1, 2, 3, 4, 5]$ 的子序列。该数组长度为 $1$,是两数组公共子序列的最小可能长度。
在第三个测试用例中,$[3]$ 和 $[2]$ 没有非空公共子序列,因此答案为 "NO"。
由 ChatGPT 4.1 翻译