canuc80k5009·10/50

Phủ Đủ Mọi Mẫu Nhị Phân

Nộp bài trên LQDOJ

Bài 50 · Eulerian Path

Một mẫu nhị phân độ dài là một xâu gồm đúng ký tự, mỗi ký tự là hoặc .

Hãy tạo một xâu nhị phân ngắn nhất sao cho mọi mẫu nhị phân độ dài đều xuất hiện ít nhất một lần dưới dạng một đoạn liên tiếp. Có thể in bất kỳ xâu ngắn nhất nào thỏa mãn.

Input

  • Input chỉ chứa một số nguyên .

Output

  • In một xâu chỉ gồm và . Xâu phải có đúng ký tự và chứa đủ mẫu nhị phân độ dài .

Constraints

  • .
  • Output chỉ gồm các ký tự và , không kể khoảng trắng cuối.
  • Độ dài bắt buộc là ; mỗi trong mẫu bit phải xuất hiện ít nhất một lần.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

3

Output

0001011100

Giải thích: Xâu có độ dài . Tám cửa sổ độ dài lần lượt phủ đủ các mẫu từ đến .

Lời giải tóm tắt
  • Mô hình: Mỗi trạng thái gồm n-1 bit là một đỉnh. Một mẫu n bit là một cung từ tiền tố n-1 bit sang hậu tố n-1 bit, được gắn nhãn bởi bit cuối.
  • Thuật toán: Dựng đồ thị de Bruijn: mỗi đỉnh là trạng thái n-1 bit, mỗi cung thêm bit 0 hoặc 1. Chạy Hierholzer từ trạng thái 0 rồi ghép n-1 số 0 với nhãn cung.
  • Chứng minh đúng: Mỗi trong 2^n cung đại diện duy nhất cho một mẫu n bit. Chu trình Euler đi qua mỗi cung đúng một lần nên các cửa sổ của xâu phủ đủ mẫu. Mọi xâu dài L chỉ có L-n+1 cửa sổ, nên cần L≥2^n+n-1; cách dựng đạt đúng cận này.
  • Độ phức tạp: Thời gian: O(2^n). Bộ nhớ nằm trong cùng bậc với cấu trúc đồ thị hoặc số trạng thái được lưu.
  • Lỗi thường gặp: chỉ in chuỗi tuần hoàn dài 2^n mà quên nối n-1 ký tự đầu.
  • Lỗi thường gặp: nối tất cả 2^n xâu n bit nên output không ngắn nhất.
  • Lỗi thường gặp: dùng sai số bit của trạng thái và bỏ sót mẫu.