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] Thống kê độ sâu phạm vi

    Xét cùng mô hình ngăn xếp phạm vi (scope) như trong bài toán bảng ký hiệu của trình biên dịch: phạm vi toàn cục có độ sâu (depth) bằng 111; mỗi lệnh BEGIN mở một khối lệnh mới làm độ sâu tăng thêm 111, mỗi lệnh END đóng khối lệnh hiện tại (nếu có) làm độ sâu giảm đi 111 nhưng không bao giờ giảm xuống dưới 111 (không thể END phạm vi toàn cục).

    Cho một dãy nnn lệnh, mỗi lệnh thuộc một trong ba dạng:

    • BEGIN: tăng độ sâu hiện tại thêm 111.
    • END: giảm độ sâu hiện tại đi 111 (nếu độ sâu đang >1>1>1; nếu đang ở độ sâu 111 thì bỏ qua, không có tác dụng).
    • DECL x: khai báo một biến tên x tại độ sâu hiện tại (không cần lưu giá trị, chỉ cần đếm).

    Hãy tính ba đại lượng thống kê sau khi thực hiện tuần tự toàn bộ nnn lệnh:

    1. Độ sâu lớn nhất từng đạt được trong suốt quá trình (kể cả độ sâu 111 ban đầu).
    2. Tổng số lệnh DECL đã thực hiện.
    3. Số lệnh DECL được thực hiện khi độ sâu lớn hơn 1 (tức là các khai báo cục bộ, nằm trong ít nhất một khối lệnh, không phải khai báo ở phạm vi toàn cục).

    Ví dụ: với dãy lệnh

    6
    DECL a
    BEGIN
    DECL b
    BEGIN
    DECL c
    END
    

    độ sâu đạt tối đa là 333 (khi khai báo c), tổng số DECL là 333 (a, b, c), và số khai báo cục bộ (độ sâu >1>1>1) là 222 (b và c, còn a ở độ sâu 111 nên không tính). Kết quả in ra:

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

      Dòng đầu tiên chứa số nguyên nnn (1≤n≤2×1051 \le n \le 2\times10^51≤n≤2×105) — số lệnh. nnn dòng tiếp theo, mỗi dòng là một lệnh có dạng BEGIN, END, hoặc DECL x (với x là tên biến, không chứa khoảng trắng; tên biến có thể trùng nhau, không cần xử lý).

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

      In ra đúng 3 dòng, theo thứ tự: độ sâu lớn nhất từng đạt được, tổng số lệnh DECL, và số lệnh DECL được thực hiện ở độ sâu lớn hơn 111.

    Ví dụ:

    Đầu vào:

    6
    DECL a
    BEGIN
    DECL b
    BEGIN
    DECL c
    END
    

    Đầu ra:

    3
    3
    2
    

    Đầu vào:

    3
    DECL a
    DECL b
    DECL c
    

    Đầu ra:

    1
    3
    0
    

    Đang tải editor...