Bộ thu gom rác đánh dấu-và-quét (mark-and-sweep) hoạt động trên một đồ thị đối tượng: có n đối tượng đánh số 1..n, đối tượng i có kích thước szi byte và có một danh sách con trỏ (cạnh có hướng) trỏ tới các đối tượng khác. Cho tập hợp r đối tượng gốc (root) — là các đối tượng được truy cập trực tiếp từ ngăn xếp hoặc biến toàn cục.
Một đối tượng được coi là sống (live) nếu nó là gốc, hoặc có thể truy cập được từ một gốc bằng cách đi theo các con trỏ (không giới hạn số bước, đồ thị có thể có chu trình). Các đối tượng không sống bị giải phóng (sweep).
Input:
4
10 20 5 7
2 2 3
1 4
0
1 1
1
1
Output:
FREED:
BYTES: 0
(cả 4 đối tượng đều tới được từ gốc 1, kể cả qua chu trình 1→2→4→1, nên không có gì bị giải phóng.)
Dòng 1: số nguyên n (0≤n≤2000). Dòng 2: n số nguyên sz1,…,szn — kích thước (byte) của đối tượng 1..n (bỏ qua dòng này nếu n=0). n dòng tiếp theo, dòng thứ i mô tả cạnh ra của đối tượng i: một số nguyên ki rồi ki số nguyên là id các đối tượng mà nó trỏ tới (ki có thể bằng 0). Dòng cuối: số nguyên r rồi r số nguyên là id các đối tượng gốc.
Dòng 1: FREED: theo sau là danh sách id các đối tượng bị giải phóng, sắp xếp tăng dần, cách nhau bởi dấu cách (nếu không đối tượng nào bị giải phóng thì chỉ in FREED:).
Dòng 2: BYTES: T với T là tổng số byte của các đối tượng bị giải phóng.
Ví dụ:
Đầu vào:
1
100
0
0
Đầu ra:
FREED: 1
BYTES: 100
Đầu vào:
4
10 20 5 7
2 2 3
1 4
0
1 1
1
1
Đầu ra:
FREED:
BYTES: 0
Đang tải editor...