Cho một biểu thức số học dạng trung tố chỉ gồm: biến (định danh chữ cái/số/_, bắt đầu bằng chữ cái hoặc _), hằng số nguyên không âm, các phép toán hai ngôi + - * / (không có phép trừ một ngôi), và cặp ngoặc đơn. Độ ưu tiên: ngoặc cao nhất; *, / (ngang hàng, kết hợp trái); thấp nhất +, - (ngang hàng, kết hợp trái).
Biểu diễn biểu thức dưới dạng cây nhị phân biểu thức (mỗi toán hạng là một lá, mỗi toán tử là một nút trong có đúng 2 con). Áp dụng thuật toán gán nhãn Sethi–Ullman để xác định số thanh ghi (biến tạm) tối thiểu đủ để sinh mã đánh giá biểu thức mà không cần lưu tạm ra bộ nhớ (spill), theo công thức đệ quy kinh điển: label(laˊ)=1 label(nuˊt)={max(l1,l2)l1+1neˆˊu l1=l2neˆˊu l1=l2 trong đó l1,l2 là nhãn của hai cây con (thứ tự không quan trọng).
Ví dụ: với (a+b)+(c+d), cây con trái a+b có nhãn 2 (hai lá cùng nhãn 1), cây con phải c+d cũng có nhãn 2; vì hai nhãn bằng nhau, nút gốc có nhãn 2+1=3. Số nút trong (số lệnh TAC cần sinh) là 3.
Một dòng duy nhất chứa biểu thức (có thể có khoảng trắng xen giữa, cần bỏ qua).
In 2 dòng:
SO_THANH_GHI_TOI_THIEU = <nhan Sethi-Ullman cua nut goc>
SO_LENH_TAC = <so nut trong cua cay, tuc so luong toan tu trong bieu thuc>
Ví dụ:
Đầu vào:
a+b
Đầu ra:
SO_THANH_GHI_TOI_THIEU = 2
SO_LENH_TAC = 1
Đầu vào:
a
Đầu ra:
SO_THANH_GHI_TOI_THIEU = 1
SO_LENH_TAC = 0
Đang tải editor...