Xét lại ngăn xếp phạm vi với n lệnh BEGIN, END, DECL x như mô tả ở các phần trước (khối gốc độ sâu 1, END không bao giờ đóng khối gốc). Một lệnh DECL x được gọi là gây ra một lần che khuất (shadow) đối với tên x nếu, ngay tại thời điểm lệnh đó được thực hiện, đã tồn tại một khai báo tên x khác còn đang hoạt động (declared nhưng khối chứa nó chưa đóng) ở một khối tổ tiên (ancestor) nào đó — tức là biến mới khai báo sẽ tạm thời che khuất biến cũ trong suốt phạm vi của khối hiện tại.
Với mỗi tên biến x xuất hiện trong chương trình, gọi kx là tổng số lần tên x gây ra hiện tượng che khuất như trên trong toàn bộ quá trình thực hiện n lệnh. Hãy in ra tất cả các tên x có kx>0, mỗi tên một dòng theo định dạng x: k_x, sắp xếp theo thứ tự tăng dần của tên biến. Nếu không có tên nào bị che khuất, in ra NONE.
Ví dụ: với các lệnh DECL a, BEGIN, DECL a, DECL b, BEGIN, DECL a, END, END, DECL b: lần DECL a thứ hai (ở độ sâu 2) che lần đầu ⇒ 1 lần che; lần DECL a thứ ba (ở độ sâu 3) che lần thứ hai (vẫn đang hoạt động) ⇒ thêm 1 lần che; DECL b thứ hai (ở độ sâu 1, sau khi khối chứa DECL b đầu đã đóng) không che ai vì không có b nào còn hoạt động. Kết quả: a: 2.
Dòng đầu tiên chứa số nguyên n (0≤n≤2000). n dòng tiếp theo là các lệnh BEGIN, END, hoặc DECL x.
In ra mỗi tên biến bị che khuất ít nhất một lần trên một dòng theo định dạng tên: số_lần, sắp xếp tăng dần theo tên; hoặc NONE nếu không có tên nào.
Ví dụ:
Đầu vào:
0
Đầu ra:
NONE
Đầu vào:
8
DECL a
BEGIN
DECL a
DECL b
BEGIN
DECL a
END
END
DECL b
Đầu ra:
a: 2
Đang tải editor...