#P11052. [IOI2024] 象形文字序列
[IOI2024] 象形文字序列
题目背景
请在提交时不要引用 hieroglyphs.h
。
请勿用 C++14 (GCC 9) 提交。
题目描述
一个研究团队正在研究象形文字序列之间的相似性。他们将每个象形文字表示成一个非负整数。为了开展研究,他们采用了关于序列的如下概念。
对于一个给定的序列 ,某个序列 被称为是 的子序列,当且仅当 能够通过移除 中的某些(也可能零个)元素而得到。
下表给出了序列 的子序列的一部分例子。
子序列 | 由 得到子序列的方式 |
---|---|
[3, 2, 1, 2] | 不移除任何元素。 |
[2, 1, 2] | [ |
[3, 2, 2] | [3, 2, |
[3, 2] | [3, |
[3] | [3, |
[ ] | [ |
另一方面, 或 不是 的子序列。
考虑有两个象形文字序列 和 。某个序列 被称为是 和 的公共子序列,当且仅当 同时是 和 的子序列。此外,我们说某个序列 是 和 的一个最全公共子序列,当且仅当如下两个条件成立:
- 是 和 的一个公共子序列。
- 和 的任意公共子序列,都是 的一个子序列。
可以证明,任意两个序列 和 都至多有一个最全公共子序列。
研究人员发现了两个象形文字序列 和 。序列 包含 个象形文字,而序列 包含 个象形文字。请帮助研究人员为序列 和 找到一个最全公共子序列,或者判定这样的序列并不存在。
输入格式
N M
A[0] A[1] ... A[N-1]
B[0] B[1] ... B[M-1]
输出格式
T
R[0] R[1] ... R[T-1]
这里 是 ucs
所返回的数组,而 为其长度。
6 5
0 0 1 0 1 2
2 0 1 0 2
4
0 1 0 2
3 2
0 0 2
1 1
0
3 3
0 1 0
1 0 1
1
-1
提示
实现细节
你要实现以下函数。
std::vector<int> ucs(std::vector<int> A, std::vector<int> B)
- :长度为 的数组,给出第一个序列。
- :长度为 的数组,给出第二个序列。
- 如果 和 有一个最全公共子序列,该函数应当返回一个包含该序列的数组。否则,该函数应当返回 (一个长度为 的数组,其唯一元素为 )。
- 对每个测试用例,该函数恰好被调用一次。
约束条件
- 对所有满足 的 ,都有
- 对所有满足 的 ,都有
子任务
子任务 | 分数 | 额外的约束条件 |
---|---|---|
1 | ; 和 均由 个不同的整数构成,取自 到 (包括这两个值) | |
2 | 对任意整数 , 在 和 中的出现次数,加起来至多等于 。 | |
3 | 对所有满足 的 ,都有 ;对所有满足 的 ,都有 | |
4 | 和 存在最全公共子序列。 | |
5 | ; | |
6 | 没有额外的约束条件。 |
例子
例 1
考虑以下函数调用。
ucs([0, 0, 1, 0, 1, 2], [2, 0, 1, 0, 2])
此时, 和 的公共子序列为:,,,,,,,,,,,, 和 。
由于 是 和 的一个公共子序列,而 和 的所有公共子序列又都是 的子序列,因此函数应该返回 。
例 2
考虑以下函数调用。
ucs([0, 0, 2], [1, 1])
此时, 和 唯一的公共子序列为空序列 。因此函数应该返回一个空数组 。
例 3
考虑以下函数调用。
ucs([0, 1, 0], [1, 0, 1])
此时, 和 的公共子序列为 ,,, 和 ,可以看出两者并不存在最全公共子序列。因此,函数应该返回 。