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 1; mỗi lệnh BEGIN mở một khối lệnh mới làm độ sâu tăng thêm 1, mỗi lệnh END đóng khối lệnh hiện tại (nếu có) làm độ sâu giảm đi 1 nhưng không bao giờ giảm xuống dưới 1 (không thể END phạm vi toàn cục).
Cho một dãy n 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 1.END: giảm độ sâu hiện tại đi 1 (nếu độ sâu đang >1; nếu đang ở độ sâu 1 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ộ n lệnh:
DECL đã thực hiện.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à 3 (khi khai báo c), tổng số DECL là 3 (a, b, c), và số khai báo cục bộ (độ sâu >1) là 2 (b và c, còn a ở độ sâu 1 nên không tính). Kết quả in ra:
3
3
2
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 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ý).
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 1.
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...