Che khuất biến (variable shadowing) xảy ra khi một biến được khai báo trong một phạm vi (scope) con trùng tên với một biến đã tồn tại ở một phạm vi bao ngoài (đang còn mở) — biến ở phạm vi con sẽ "che" mất biến ngoài trong suốt phạm vi con đó, dù biến ngoài vẫn tồn tại và sẽ "lộ" trở lại khi phạm vi con kết thúc.
Xét mô hình ngăn xếp phạm vi quen thuộc: BEGIN đẩy một phạm vi rỗng mới, END gỡ phạm vi ở đỉnh ngăn xếp (không bao giờ gỡ phạm vi toàn cục), DECL x v khai báo biến x (giá trị v không quan trọng, chỉ để đủ định dạng) vào phạm vi ở đỉnh ngăn xếp hiện tại.
Cho dãy n lệnh (đánh số dòng lệnh từ 1 đến n), một lệnh DECL x v được xem là gây ra sự kiện che khuất nếu tên x đã tồn tại ở bất kỳ phạm vi nào khác đang mở trong ngăn xếp, không tính phạm vi ở đỉnh ngăn xếp hiện tại (tức là chỉ so với các phạm vi bao ngoài, bỏ qua trường hợp trùng tên ngay trong cùng phạm vi — đó là lỗi khai báo trùng, không phải che khuất).
Hãy liệt kê tất cả các sự kiện che khuất theo đúng thứ tự xảy ra.
Ví dụ: với dãy lệnh
6
DECL x 1
BEGIN
DECL x 2
DECL y 3
BEGIN
DECL y 4
lệnh số 3 (DECL x 2) che khuất x của phạm vi toàn cục (lệnh 1); lệnh số 6 (DECL y 4) che khuất y đã khai báo ở lệnh 4 (phạm vi bao ngoài, vẫn đang mở). Kết quả in ra:
2
3 x
6 y
Dòng đầu tiên chứa số nguyên n (1≤n≤2×105) — số lệnh.
n dòng tiếp theo, mỗi dòng là một lệnh dạng BEGIN, END, hoặc DECL x v (x, v là các chuỗi không chứa khoảng trắng). Dữ liệu đảm bảo mọi END đều khớp với một BEGIN đã mở trước đó.
Dòng đầu tiên in ra số lượng sự kiện che khuất k. k dòng tiếp theo, mỗi dòng gồm số hiệu dòng lệnh và tên biến (cách nhau một khoảng trắng), theo đúng thứ tự thời gian xảy ra. Nếu k=0 thì chỉ in dòng 0, không có dòng nào tiếp theo.
Ví dụ:
Đầu vào:
6
DECL x 1
BEGIN
DECL x 2
DECL y 3
BEGIN
DECL y 4
Đầu ra:
2
3 x
6 y
Đầu vào:
4
DECL a 1
BEGIN
DECL b 2
END
Đầu ra:
0
Đang tải editor...