Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Tự động sửa ngoặc lệch bằng chèn ký hiệu bổ khuyết

    Khác với chế độ hoảng loạn (chỉ bỏ qua phần tử lỗi), nhiều trình soạn thảo/biên dịch dùng chiến lược phục hồi bằng chèn thêm ký hiệu để tự động "vá" lỗi ngoặc lệch. Cho chuỗi sss chỉ chứa 3 loại ngoặc ()[]{} và có thể xen lẫn ký tự khác (giữ nguyên, không ảnh hưởng thuật toán), hãy mô phỏng thuật toán sửa lỗi sau, dùng ngăn xếp:

    Duyệt sss từ trái sang phải, xây dựng dần chuỗi kết quả:

    • Ký tự mở: đẩy vào ngăn xếp, thêm vào kết quả.
    • Ký tự khác (không phải ngoặc): thêm nguyên vẹn vào kết quả, không đổi ngăn xếp.
    • Ký tự đóng ccc: lặp lại quy trình sau cho đến khi dừng (dừng khi ngăn xếp rỗng, hoặc ccc khớp với đỉnh ngăn xếp):
      • Nếu ngăn xếp rỗng: ccc là "thừa" (spurious) — loại bỏ ccc (không thêm vào kết quả), tăng biến đếm discards, dừng vòng lặp cho ký tự này.
      • Ngược lại, gọi eee là ký tự đóng tương ứng với đỉnh ngăn xếp. Nếu c=ec = ec=e: khớp, lấy đỉnh ra khỏi ngăn xếp, thêm ccc vào kết quả, dừng vòng lặp cho ký tự này. Nếu c≠ec \ne ec=e: giả định ngoặc ở đỉnh đang bị thiếu ký tự đóng eee — chèn eee vào kết quả, tăng biến đếm insertions, lấy đỉnh ra khỏi ngăn xếp, rồi lặp lại (so sánh tiếp ccc với đỉnh mới của ngăn xếp).

    Sau khi duyệt hết sss, nếu ngăn xếp còn ký tự mở dư, lần lượt lấy ra từng ký tự (từ đỉnh xuống đáy) và chèn ký tự đóng tương ứng vào cuối kết quả (mỗi lần tăng insertions).

    In ra 2 số insertions discards, và chuỗi kết quả sau khi sửa.

    Ví dụ: s=s=s= (a[b)c]. Xử lý: ( đẩy, a giữ nguyên, [ đẩy, b giữ nguyên; gặp ): đỉnh là [ cần đóng bằng ] ≠\ne= ) ⇒\Rightarrow⇒ chèn ], lấy [ ra (insertions=1); so lại ) với đỉnh mới ( cần đóng bằng ) === ) ⇒\Rightarrow⇒ khớp, lấy ( ra, thêm ); c giữ nguyên; gặp ]: ngăn xếp rỗng ⇒\Rightarrow⇒ thừa, loại bỏ (discards=1). Kết quả: insertions=1, discards=1, chuỗi sửa: (a[b])c.

    • Định dạng đầu vào:

      Một dòng duy nhất chứa chuỗi sss (0≤∣s∣≤1050 \le |s| \le 10^50≤∣s∣≤105), có thể rỗng.

    • Định dạng đầu ra:

      Dòng 1: 2 số nguyên insertions discards cách nhau 1 dấu cách. Dòng 2: chuỗi kết quả sau khi sửa (có thể rỗng — in ra dòng trống).

    Ví dụ:

    Đầu vào:

    (a[b)c]

    Đầu ra:

    1 1
    (a[b])c
    

    Đầu vào:

    (a[b]{c})

    Đầu ra:

    0 0
    (a[b]{c})
    

    Đang tải editor...