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 tham chiếu trong bộ nhớ máy ảo

    Một máy ảo quản lý bộ nhớ bằng kỹ thuật đếm tham chiếu (reference counting). Có 101010 biến (thanh ghi tham chiếu) V0,V1,…,V9V_0, V_1, \ldots, V_9V0​,V1​,…,V9​, ban đầu đều là null (không trỏ tới đối tượng nào). Các đối tượng trên vùng nhớ heap được cấp phát tuần tự, đối tượng được tạo đầu tiên có id 111, đối tượng tiếp theo có id 222, v.v. Mỗi đối tượng có một bộ đếm tham chiếu (refcount), khi refcount giảm về 000 thì đối tượng đó bị giải phóng vĩnh viễn (không bao giờ có refcount dương trở lại).

    Các lệnh (một lệnh một dòng):

    • NEW i: cấp phát một đối tượng mới (refcount khởi tạo =1=1=1), gán ViV_iVi​ trỏ tới đối tượng đó. Nếu trước đó ViV_iVi​ đang trỏ tới một đối tượng khác, refcount của đối tượng cũ giảm đi 111.
    • COPY i j: gán Vi←VjV_i \gets V_jVi​←Vj​ (sao chép tham chiếu; nếu VjV_jVj​ là null thì ViV_iVi​ cũng thành null). Nếu giá trị mới không phải null, refcount của đối tượng đó tăng 111. Nếu ViV_iVi​ trước đó đang trỏ tới một đối tượng, refcount đối tượng cũ giảm 111.
    • CLEAR i: gán Vi←V_i \getsVi​← null. Nếu ViV_iVi​ trước đó đang trỏ tới một đối tượng, refcount đối tượng đó giảm 111.

    Sau khi thực thi hết chương trình, hãy liệt kê id các đối tượng còn sống (refcount >0> 0>0).

    Ví dụ:

    NEW 0
    COPY 1 0
    CLEAR 0
    

    NEW 0 tạo đối tượng id 111 (refcount 111) gán vào V0V_0V0​. COPY 1 0 gán V1←V0V_1 \gets V_0V1​←V0​ (đối tượng 111), refcount đối tượng 111 tăng lên 222. CLEAR 0 xoá V0V_0V0​, refcount đối tượng 111 giảm còn 111. Kết quả: đối tượng còn sống là 1.

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

      Dòng đầu chứa số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000) là số lệnh. nnn dòng tiếp theo, mỗi dòng là một lệnh theo cú pháp trên, với chỉ số biến i,ji, ji,j luôn thoả 0≤i,j≤90 \le i, j \le 90≤i,j≤9.

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

      In ra một dòng chứa các id đối tượng còn sống, theo thứ tự tăng dần, cách nhau bởi một dấu cách. Nếu không còn đối tượng nào sống, in ra NONE.

    Ví dụ:

    Đầu vào:

    3
    NEW 0
    COPY 1 0
    CLEAR 0
    

    Đầu ra:

    1
    

    Đầu vào:

    3
    NEW 0
    NEW 1
    CLEAR 0
    

    Đầu ra:

    2
    

    Đang tải editor...