IOI 2024 - Hieroglyphs

Xem PDF



Dạng bài
Ngôn ngữ cho phép
C++
Điểm: 2600 (p) Thời gian: 1.0s Bộ nhớ: 2G Input: bàn phím Output: màn hình

Một nhóm các nhà nghiên cứu đang nghiên cứu những điểm tương đồng giữa các dãy chữ tượng hình. Họ biểu diễn mỗi chữ tượng hình bằng một số nguyên không âm. Để thực hiện nghiên cứu, họ sử dụng các khái niệm sau đây về các dãy.

Với một dãy \(A\) cố định, dãy \(S\) được gọi là dãy con của \(A\) khi và chỉ khi \(S\) có thể nhận được bằng cách xoá bỏ một số phần tử (hoặc không xoá phần tử nào) của \(A\).

Bảng sau cho thấy một số ví dụ về dãy con của dãy \(A = [3, 2, 1, 2]\).

Dãy con Các vị trí bị xoá khỏi \(A\) (đánh số từ \(1\))
[3, 2, 1, 2] Không có
[2, 1, 2] \(1\)
[3, 2, 2] \(3\)
[3, 2] \(2, 3\) hoặc \(3, 4\)
[3] \(2, 3, 4\)
[ ] \(1, 2, 3, 4\)

Mặt khác, \([3, 3]\) hoặc \([1, 3]\) không phải dãy con của \(A\).

Xét hai dãy chữ tượng hình, \(A\)\(B\). Một dãy \(S\) được gọi là dãy con chung của \(A\)\(B\) khi và chỉ khi \(S\) là dãy con của cả \(A\)\(B\). Hơn nữa, ta nói dãy \(U\)dãy con chung vũ trụ của \(A\)\(B\) khi và chỉ khi hai điều kiện sau thoả mãn:

  • \(U\) là dãy con chung của \(A\)\(B\).
  • Mọi dãy con chung của \(A\)\(B\) đều là dãy con của \(U\).

Có thể chứng minh được rằng mọi cặp dãy \(A\)\(B\) có nhiều nhất một dãy con chung vũ trụ.

Các nhà nghiên cứu đã tìm thấy hai dãy chữ tượng hình \(A\)\(B\). Dãy \(A\)\(N\) chữ tượng hình và dãy \(B\)\(M\) chữ tượng hình. Hãy giúp các nhà nghiên cứu tìm ra dãy con chung vũ trụ của hai dãy \(A\)\(B\), hoặc xác định dãy như vậy không tồn tại.

Chi tiết cài đặt

Bạn cần cài đặt hàm sau.

C++
std::vector<int> ucs(std::vector<int> A, std::vector<int> B)
  • \(A\): mảng có độ dài \(N\) mô tả dãy đầu tiên.
  • \(B\): mảng có độ dài \(M\) mô tả dãy thứ hai.
  • Nếu tồn tại dãy con chung vũ trụ của \(A\)\(B\), hàm cần trả về mảng chứa dãy này. Ngược lại, hàm cần trả về \([-1]\) (mảng có độ dài \(1\), có đúng một phần tử \(-1\)).
  • Hàm này được gọi đúng một lần cho mỗi trường hợp test.

Các ràng buộc

  • \(1 \leq N \leq 100\,000\)
  • \(1 \leq M \leq 100\,000\)
  • \(0 \leq A[i] \leq 200\,000\) với mỗi \(i\) thoả mãn \(0 \leq i < N\)
  • \(0 \leq B[j] \leq 200\,000\) với mỗi \(j\) thoả mãn \(0 \leq j < M\)

Các subtasks

Subtask Điểm Các ràng buộc thêm
1 \(3\) \(N = M\); mỗi dãy \(A\)\(B\) chứa \(N\) số nguyên phân biệt giữa \(0\)\(N-1\) (bao gồm cả \(0\)\(N-1\))
2 \(15\) Với số nguyên \(k\) bất kì, (số lượng phần tử của \(A\) bằng \(k\)) cộng (số lượng phần tử của \(B\) bằng \(k\)) nhiều nhất là \(3\).
3 \(10\) \(A[i] \leq 1\) với mỗi \(i\) thoả mãn \(0 \leq i < N\); \(B[j] \leq 1\) với mỗi \(j\) thoả mãn \(0 \leq j < M\)
4 \(16\) Tồn tại dãy con chung vũ trụ của \(A\)\(B\).
5 \(14\) \(N \leq 3000\); \(M \leq 3000\)
6 \(42\) Không có ràng buộc nào thêm.

Các ví dụ

Ví dụ 1

Xét lời gọi hàm sau.

C++
ucs([0, 0, 1, 0, 1, 2], [2, 0, 1, 0, 2])

Trong đó, các dãy con chung của \(A\)\(B\) là: \([\ ]\), \([0]\), \([1]\), \([2]\), \([0, 0]\), \([0, 1]\), \([0, 2]\), \([1, 0]\), \([1, 2]\), \([0, 0, 2]\), \([0, 1, 0]\), \([0, 1, 2]\), \([1, 0, 2]\)\([0, 1, 0, 2]\).

Vì dãy \([0, 1, 0, 2]\) là dãy con chung của \(A\)\(B\), và mọi dãy con chung của \(A\)\(B\) là dãy con của dãy \([0, 1, 0, 2]\), hàm cần trả về mảng \([0, 1, 0, 2]\).

Ví dụ 2

Xét lời gọi hàm sau.

C++
ucs([0, 0, 2], [1, 1])

Trong đó, dãy con chung duy nhất của \(A\)\(B\) là dãy rỗng \([\ ]\). Vì vậy, hàm cần trả về mảng rỗng \([\ ]\).

Ví dụ 3

Xét lời gọi hàm sau.

C++
ucs([0, 1, 0], [1, 0, 1])

Trong đó, dãy con chung của \(A\)\(B\)\([\ ], [0], [1], [0, 1]\)\([1, 0]\). Có thể chứng minh rằng dãy con chung vũ trụ không tồn tại. Vì vậy, hàm cần trả về mảng \([-1]\).

Trình chấm mẫu

Định dạng dữ liệu vào:

N  M
A[0]  A[1]  ...  A[N-1]
B[0]  B[1]  ...  B[M-1]

Định dạng kết quả ra:

T
R[0]  R[1]  ...  R[T-1]

Trong đó, \(R\) là mảng trả về bởi hàm ucs\(T\) là độ dài của nó.


Nguồn: Olympic Tin học Quốc tế (IOI) 2024. Bản dịch tiếng Việt chính thức do ban tổ chức cung cấp.

Tệp

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: