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 số lần mỗi tên biến bị che khuất

    Xét lại ngăn xếp phạm vi với nnn lệnh BEGIN, END, DECL x như mô tả ở các phần trước (khối gốc độ sâu 111, 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 xxx 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 xxx 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 xxx xuất hiện trong chương trình, gọi kxk_xkx​ là tổng số lần tên xxx gây ra hiện tượng che khuất như trên trong toàn bộ quá trình thực hiện nnn lệnh. Hãy in ra tất cả các tên xxx có kx>0k_x > 0kx​>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 ⇒\Rightarrow⇒ 1 lần che; lần DECL a thứ ba (ở độ sâu 3) che lần thứ hai (vẫn đang hoạt động) ⇒\Rightarrow⇒ 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.

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

      Dòng đầu tiên chứa số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000). nnn dòng tiếp theo là các lệnh BEGIN, END, hoặc DECL x.

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

      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...