Lệnh tiến công

Xem dạng PDF

Gửi bài giải

Điểm: 0,01 (OI)
Giới hạn thời gian: 0.5s
Giới hạn bộ nhớ: 256M

Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Đây là một bài toán chạy hai lần (run-twice communication).

Ngày DD tới, vào giờ HH:MM, toàn quân tổng tiến công!

Đó là quân lệnh từ sở chỉ huy cần được truyền tới tất cả các đơn vị chiến đấu. Tuấn phụ trách thiết kế hệ thống đảm bảo thông điệp được truyền đi an toàn và chính xác. Thông điệp cần truyền gồm ba số DD, HH, MM và được xử lý qua ba giai đoạn:

  1. Mã hoá: tại sở chỉ huy, thông điệp DD, HH, MM được mã hoá thành một dãy bit.
  2. Truyền tin: dãy bit được truyền tới các máy nhận ở các đơn vị bằng phương tiện thô sơ. Do kĩ thuật thô sơ và phụ thuộc kĩ năng con người, dãy bit truyền đi có thể bị sai tối đa 1 bit.
  3. Giải mã: từ dãy bit nhận được, đơn vị giải mã lại thông điệp DD, HH, MM ban đầu.

Vì đường truyền có thể sai 1 bit, hệ thống mã hoá phải có khả năng tự phát hiện và sửa lỗi: cho dù dãy bit nhận được sai 1 bit so với dãy đã gửi, đơn vị vẫn phải khôi phục lại đúng thông điệp ban đầu.

Nhiệm vụ của bạn là viết một chương trình giúp Tuấn thực hiện cả việc mã hoá và giải mã.

Chương trình sẽ được chạy hai lần:

  • Ở lần chạy thứ nhất, chương trình của bạn đóng vai sở chỉ huy (mã hoá). Chương trình nhận vào các thông điệp DD HH MM, và với mỗi thông điệp phải xuất ra một dãy bit mã hoá.

  • Ở lần chạy thứ hai, chương trình của bạn đóng vai đơn vị nhận (giải mã). Chương trình nhận vào các dãy bit nhận được — mỗi dãy sai không quá 1 bit so với một dãy mã hoá mà chính chương trình của bạn đã xuất ra ở lần chạy thứ nhất — và với mỗi dãy phải xuất ra thông điệp đã được giải mã.

Input

Lần chạy thứ nhất

Dòng đầu tiên chứa chuỗi Encode. Mục đích của điều này là để chương trình của bạn nhận ra đây là lần chạy đầu tiên, và nó nên hoạt động như bên mã hoá.

Tiếp theo, dòng đầu tiên chứa một số nguyên ~t~ (~1 \le t \le 20~) — số lượng thông điệp cần mã hoá. Mỗi trong ~t~ dòng tiếp theo chứa ba số nguyên ~DD~, ~HH~, ~MM~ (~1 \le DD \le 31~, ~0 \le HH \le 23~, ~0 \le MM \le 59~) — một thông điệp cần mã hoá (ngày, giờ, phút).

Lần chạy thứ hai

Dòng đầu tiên chứa chuỗi Decode. Mục đích của điều này là để chương trình của bạn nhận ra đây là lần chạy thứ hai, và nó nên hoạt động như bên giải mã.

Tiếp theo, dòng đầu tiên chứa một số nguyên ~q~ (~q \ge 1~) — số lượng dãy bit cần giải mã. Mỗi trong ~q~ dòng tiếp theo chứa một dãy bit — một xâu chỉ gồm các kí tự 0 hoặc 1, độ dài từ ~1~ đến ~50~ — là một dãy bit mà đơn vị nhận được.

Đảm bảo rằng:

  • Ở lần chạy thứ hai, mỗi dãy bit cần giải mã chính là một dãy bit mà chương trình của bạn đã xuất ra ở lần chạy thứ nhất, sau khi bị đảo nhiều nhất 1 bit (có thể giữ nguyên, không đảo bit nào).

  • Hai lần chạy là hai tiến trình độc lập: dữ liệu lưu trong biến toàn cục ở lần chạy thứ nhất không còn tồn tại ở lần chạy thứ hai.

Output

Lần chạy thứ nhất

Với mỗi thông điệp (theo đúng thứ tự được đưa vào), xuất ra trên một dòng dãy bit mã hoá tương ứng: một xâu chỉ gồm các kí tự 0 hoặc 1, độ dài ~L~ với ~1 \le L \le 50~.

Lần chạy thứ hai

Với mỗi dãy bit nhận được (theo đúng thứ tự được đưa vào), xuất ra trên một dòng thông điệp đã giải mã theo định dạng DD HH:MM, trong đó ~DD~, ~HH~, ~MM~ đều gồm đúng hai chữ số (thêm số ~0~ ở đầu nếu cần), ví dụ 01 12:05 hoặc 28 05:27.

Thông điệp giải mã phải trùng khớp với thông điệp gốc mà từ đó dãy bit đã được tạo ra ở lần chạy thứ nhất.

Interaction

Chương trình của bạn tự nhận biết mình đang ở lần chạy nào nhờ dòng đầu tiên của dữ liệu vào (Encode hoặc Decode), rồi đọc phần dữ liệu còn lại và ghi kết quả tương ứng.

Scoring

Điểm của mỗi test là trung bình cộng điểm của từng thông điệp trong test đó.

Một thông điệp được 0 điểm nếu xảy ra một trong các trường hợp:

  • Tương tác sai quy cách (dãy bit mã hoá không hợp lệ, hoặc thông điệp giải mã sai định dạng);
  • Chạy sinh lỗi (runtime error);
  • Chạy quá thời gian (TLE);
  • Có ít nhất một dãy bit (trong số các dãy bắt nguồn từ thông điệp này) được giải mã ra khác với thông điệp gốc.

Ngược lại, nếu thông điệp được mã hoá và giải mã đúng, gọi ~L~ là độ dài dãy bit mã hoá của thông điệp đó; điểm của thông điệp được tính dựa trên độ tốt của ~L~ như sau:

Độ dài dãy bit mã hoá ~L~ Điểm
~1 \le L \le 21~ ~100\%~
~L = 22~ ~90\%~
~L = 23~ ~75\%~
~24 \le L \le 25~ ~60\%~
~26 \le L \le 30~ ~45\%~
~31 \le L \le 35~ ~30\%~
~36 \le L \le 40~ ~20\%~
~41 \le L \le 50~ ~10\%~

Sample Input 1

Encode
2
1 0 0
2 0 0

Sample Output 1

0000
1110

Sample Input 2

Decode
10
0010
1110
0000
1100
1000
0110
0001
1111
0100
1010

Sample Output 2

01 00:00
02 00:00
01 00:00
02 00:00
01 00:00
02 00:00
01 00:00
02 00:00
01 00:00
02 00:00

Notes

Hai ví dụ tương ứng với hai lần chạy của cùng một chương trình. Ở lần chạy thứ nhất, chương trình mã hoá 01 00:00 thành 0000 và 02 00:00 thành 1110. Ở lần chạy thứ hai, chương trình nhận các dãy bit — mỗi dãy sai không quá 1 bit so với một trong hai dãy mã hoá trên — rồi giải mã lại thông điệp ban đầu.

Ví dụ chỉ minh hoạ cách chương trình tương tác. Cách mã hoá 0000 / 1110 ở đây chỉ phục vụ ví dụ, không phải cách mã hoá hợp lệ cho toàn bộ bài toán.


Đang tải...