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] Đếm rác bằng đếm tham chiếu (Reference Counting) đơn giản

    Trong nhiều ngôn ngữ (Python, Swift, Objective-C...), bộ thu gom rác dùng kỹ thuật đếm tham chiếu (reference counting): mỗi object có một bộ đếm rcrcrc = số tham chiếu đang trỏ tới nó. Khi rcrcrc giảm về 000, object được giải phóng (free) ngay lập tức.

    Có nnn object đánh số từ 111 đến nnn (ban đầu rci=0rc_i = 0rci​=0 với mọi iii, chưa object nào được tham chiếu). Có các biến (đặt tên bởi chuỗi chữ/số, phân biệt hoa-thường), ban đầu không trỏ tới object nào. Mô phỏng mmm thao tác lần lượt:

    • SET v o: cho biến vvv trỏ tới object ooo.
      • Nếu vvv đang trỏ đúng tới ooo rồi: không có gì thay đổi.
      • Nếu vvv đang trỏ tới object khác ocu~≠oo_{cũ} \neq oocu~​=o: giảm rcocu~rc_{o_{cũ}}rcocu~​​ đi 111 trước (nếu về 000, giải phóng ngay); sau đó cho vvv trỏ tới ooo và tăng rcorc_orco​ lên 111.
      • Nếu vvv chưa trỏ tới object nào: cho vvv trỏ tới ooo và tăng rcorc_orco​ lên 111.
    • CLEAR v: hủy tham chiếu của biến vvv (đề bài đảm bảo vvv đang trỏ tới một object). Giảm rcrcrc của object đó đi 111 (giải phóng ngay nếu về 000).

    Yêu cầu: in ra dãy id các object bị giải phóng theo đúng thứ tự thời gian chúng bị giải phóng (mỗi object chỉ giải phóng đúng một lần), và số lượng object còn "sống" (rc>0rc>0rc>0) sau khi thực hiện xong tất cả thao tác.

    Ví dụ: n=3,m=3n=3, m=3n=3,m=3: SET a 1, SET b 2, SET a 3 → object 111 bị giải phóng ngay khi a chuyển sang trỏ tới 333 (vì rc1rc_1rc1​ về 000). Kết quả: dãy giải phóng là 1; số object còn sống là 2.

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

      Dòng 1: hai số nguyên n mn\ mn m (0≤n≤2000 \le n \le 2000≤n≤200, 0≤m≤5000 \le m \le 5000≤m≤500). mmm dòng tiếp theo, mỗi dòng là một thao tác đúng cú pháp SET v o hoặc CLEAR v (vvv là chuỗi không chứa khoảng trắng, độ dài ≤10\le 10≤10; 1≤o≤n1 \le o \le n1≤o≤n). Dữ liệu đảm bảo hợp lệ: CLEAR v chỉ được gọi khi vvv đang trỏ tới một object.

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

      Dòng 1: các id object bị giải phóng theo thứ tự giải phóng, cách nhau 1 dấu cách; in NONE nếu không có object nào bị giải phóng. Dòng 2: số lượng object còn sống (rc>0rc>0rc>0) khi kết thúc.

    Ví dụ:

    Đầu vào:

    3 3
    SET a 1
    SET b 2
    SET a 3
    

    Đầu ra:

    1
    2
    

    Đầu vào:

    1 0
    

    Đầu ra:

    NONE
    0
    

    Đang tải editor...