BOI 2006 - RLE Compression

Xem PDF



Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 2400 Thời gian: 10.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

RLE là một phương pháp nén các dãy có nhiều ký tự giống nhau liên tiếp. Bảng chữ cái gồm \(n\) ký tự, biểu diễn bởi các số trong

\[ \Sigma=\{0,1,\ldots,n-1\}. \]

Mã của một dãy cũng là một dãy ký tự thuộc \(\Sigma\). Tại mọi thời điểm có một ký tự đánh dấu lặp \(e\); ban đầu \(e=0\), nhưng ký tự này có thể thay đổi trong quá trình giải mã.

  • Mọi ký tự \(a\ne e\) trong mã biểu diễn chính nó.
  • Nếu gặp \(e\), hai ký tự \(b,k\) tiếp theo được hiểu như sau:
    • nếu \(b=e\), bộ ba \(e,e,k\) biểu diễn \(k+1\) lần ký tự \(e\);
    • nếu \(b\ne e\)\(k=0\), từ thời điểm đó ký tự đánh dấu lặp đổi thành \(b\); bộ ba này không sinh ký tự nào;
    • nếu \(b\ne e\)\(k>0\), bộ ba \(e,b,k\) biểu diễn \(k+3\) lần ký tự \(b\).

Một dãy có thể có nhiều mã với độ dài khác nhau. Cho một mã hợp lệ, hãy tìm một mã ngắn nhất biểu diễn cùng dãy đã giải mã.

Dữ liệu vào

Dòng đầu chứa \(n\). Dòng thứ hai chứa \(m\), độ dài mã đã cho. Dòng cuối chứa \(m\) số nguyên thuộc \(\Sigma\).

Dữ liệu ra

Dòng đầu chứa \(m'\), độ dài nhỏ nhất của một mã biểu diễn cùng dãy. Dòng cuối chứa \(m'\) số nguyên của một mã ngắn nhất. Nếu có nhiều đáp án, có thể in bất kỳ đáp án nào.

Ràng buộc

  • \(2\le n\le 100\,000\).
  • \(1\le m\le 2\,000\,000\).

Ví dụ

Ví dụ 1

Input
4
20
1 0 0 1 0 2 3 0 3 2 0 1 0 0 3 0 2 1 0 1
Output
19
1 0 1 0 0 0 1 2 3 1 3 2 0 3 0 2 1 0 1

Ví dụ 2

Input
14
15
10 10 10 0 10 0 10 10 13 10 10 13 10 10 13
Output
9
0 10 13 0 10 13 0 10 10

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: