canuc80k6505·6/50

Cắt rồi ghép xâu

Nộp bài trên LQDOJ

Bài 65 · Balanced Binary Search Tree

Cho một chuỗi cố định độ dài . Mỗi thao tác cắt đoạn ký tự từ vị trí đến khỏi vị trí hiện tại và dán nguyên đoạn đó vào cuối chuỗi. Hãy in chuỗi sau mọi thao tác.

Với thao tác , lấy đúng các ký tự đang ở vị trí , xóa chúng khỏi xâu rồi nối nguyên thứ tự của đoạn ấy vào cuối. Mọi vị trí được đánh số từ trên trạng thái trước thao tác.

Input

  • Dòng đầu chứa . Dòng thứ hai chứa xâu ban đầu dài . Mỗi dòng trong số dòng tiếp theo chứa .

Output

  • In xâu sau khi thực hiện toàn bộ thao tác.

Constraints

  • .
  • ; độ dài xâu luôn bằng .

Scoring

  • Subtask small: điểm, gồm test nhỏ.
  • Subtask full: điểm, gồm test không có giới hạn bổ sung ngoài phần Constraints.
  • Mỗi test có giá trị điểm.

Example

Test 1

Input

7 3
ABCDEFG
2 5
3 4
1 2

Output

CDEGBAF

Giải thích: Cắt BCDE đưa xâu thành AFGBCDE, rồi cắt GB được AFCDEGB. Cuối cùng chuyển AF xuống cuối nên xâu là CDEGBAF.

Lời giải tóm tắt
  • Ý tưởng: Với chuỗi hiện tại L + M + R, trong đó M là [a,b]:
  • Ý tưởng: 1. Split sau b ký tự: lấy X = L+M và R. 2. Split X sau a-1 ký tự: lấy L và M. 3. Chuỗi mới là L + R + M, nên gốc mới là merge(merge(L,R),M).
  • Ý tưởng: Cuối cùng duyệt giữa Treap để xuất ký tự.
  • Chứng minh đúng: Hai split theo kích thước tạo đúng ba đoạn liên tiếp L, M, R mà không thay đổi thứ tự nội bộ. Hai merge được gọi trên các đoạn cần đứng liên tiếp và chỉ thay đổi hình dạng cây, không đổi thứ tự duyệt giữa. Vì thứ tự mới theo đề là L,R,M, cây sau merge biểu diễn chính xác chuỗi sau thao tác. Lặp lại lập luận cho mọi thao tác cho kết quả cuối đúng.
  • Độ phức tạp: Kỳ vọng O((n+m) log n) với cách dựng bằng merge tuần tự; O(n) bộ nhớ.