Trong quá trình biên dịch, mỗi khối lệnh { ... } mở ra một phạm vi (scope) mới lồng bên trong phạm vi bao quanh nó, và trình biên dịch quản lý các phạm vi này bằng một ngăn xếp phạm vi (scope stack) trong bảng ký hiệu. Toàn bộ chương trình được coi là nằm trong một khối gốc có độ sâu bằng 1.
Cho n lệnh, mỗi lệnh thuộc một trong ba dạng sau:
BEGIN: mở một khối con mới (độ sâu hiện tại tăng thêm 1);END: đóng khối con đang mở gần nhất (độ sâu hiện tại giảm đi 1); dữ liệu vào đảm bảo lệnh này không bao giờ được thực hiện khi đang ở khối gốc (độ sâu 1);DECL x: khai báo một biến tên x vào bảng ký hiệu của khối đang mở (độ sâu hiện tại), không ảnh hưởng tới độ sâu.Gọi D là độ sâu lớn nhất mà chương trình từng đạt tới trong suốt quá trình thực hiện tuần tự n lệnh trên (kể cả khi không có lệnh nào, D=1 vì khối gốc luôn tồn tại). Hãy tính D và số lệnh DECL được thực hiện đúng vào những thời điểm độ sâu hiện tại bằng D.
Ví dụ: với 6 lệnh DECL a, BEGIN, DECL b, BEGIN, DECL c, END, độ sâu lớn nhất đạt được là D=3 (ngay sau lệnh BEGIN thứ hai), và chỉ có đúng một lệnh DECL (là DECL c) được thực hiện ở độ sâu 3. Kết quả in ra là 3 1.
Dòng đầu tiên chứa số nguyên n (0≤n≤2000) — số lệnh. n dòng tiếp theo, mỗi dòng là một lệnh BEGIN, END, hoặc DECL x (với x là một chuỗi chữ cái/chữ số không chứa khoảng trắng).
In ra một dòng gồm hai số nguyên D và C cách nhau bởi một khoảng trắng.
Ví dụ:
Đầu vào:
0
Đầu ra:
1 0
Đầu vào:
6
DECL a
BEGIN
DECL b
BEGIN
DECL c
END
Đầu ra:
3 1
Đang tải editor...