Cho m câu lệnh mã ba địa chỉ dạng SSA (mỗi biến tạm chỉ được gán đúng một lần), mỗi câu lệnh có dạng:
tI = A OP B
với OP∈{+,−,∗,/}, trong đó mỗi toán hạng A, B hoặc là một hằng số nguyên, hoặc là một biến (có thể là biến nguồn như a, b, ... hoặc một biến tạm tj đã được định nghĩa trước đó, j<I).
Áp dụng kỹ thuật đánh số giá trị cục bộ (local value numbering - LVN) để phát hiện các biểu thức con chung: gán cho mỗi giá trị khác nhau xuất hiện trong chương trình (mỗi hằng số, mỗi biến nguồn lần đầu xuất hiện, hoặc mỗi kết quả phép toán) một số hiệu giá trị (value number - VN) duy nhất - hai toán hạng có cùng VN được xem là luôn có cùng giá trị tại thời điểm đó. Với hai toán tử giao hoán (+,∗), biểu thức A OP B và B OP A được coi là cùng một biểu thức nếu cặp VN của toán hạng giống nhau (không phân biệt thứ tự); với −,/ (không giao hoán) thì thứ tự toán hạng có phân biệt.
Một câu lệnh tI=A OP B được xem là dư thừa (redundant) nếu đã tồn tại một câu lệnh trước đó tính ra cùng giá trị (cùng OP, cùng cặp VN toán hạng theo quy tắc trên) - khi đó lệnh này lẽ ra có thể thay bằng phép gán từ kết quả đã tính trước đó thay vì tính lại. Hãy đếm số câu lệnh dư thừa trong toàn bộ chương trình.
Dòng 1: số nguyên m.
m dòng tiếp theo: mỗi câu lệnh tI = A OP B (token cách nhau đúng 1 khoảng trắng; tI là t nối số thứ tự lệnh i).
In ra duy nhất một số nguyên - số câu lệnh dư thừa (redundant).
Ví dụ input:
4
t1 = a + b
t2 = b + a
t3 = a * b
t4 = t1 + t3
Output: 1 (t2 tính lại đúng giá trị đã có ở t1 do phép + giao hoán; t3, t4 là các giá trị mới).
Ví dụ:
Đầu vào:
3
t1 = a + b
t2 = a - b
t3 = a * b
Đầu ra:
0
Đầu vào:
4
t1 = a + b
t2 = b + a
t3 = a * b
t4 = t1 + t3
Đầu ra:
1
Đang tải editor...