Trong giai đoạn tiền xử lý (preprocessing) của một trình biên dịch giống C, chỉ thị #define TÊN GIÁ_TRỊ khai báo một macro đối tượng (object-like macro): mọi lần token TÊN xuất hiện trong mã nguồn sau đó sẽ được thay thế (một cách thuần túy về mặt văn bản) bằng GIÁ_TRỊ.
Cho n macro đối tượng (không phụ thuộc lẫn nhau — giá trị của mỗi macro chỉ là một token đơn, không phải tên của một macro khác) và m dòng mã nguồn. Hãy thực hiện tiền xử lý: với mỗi dòng mã nguồn, tách dòng thành các token rồi thay thế mỗi token trùng đúng tên một macro bằng giá trị tương ứng, in ra dòng đã được mở rộng.
Quy tắc tách token: một token là một dãy ký tự chữ/số/gạch dưới liên tiếp tối đa ([A-Za-z0-9_]+), hoặc là một ký tự đơn không phải khoảng trắng khác (ví dụ (, ), [, ], ;, +, ,, ...). Khoảng trắng chỉ dùng để phân tách, không xuất hiện trong token.
Ví dụ: với macro PI 3 và MAX_N 100, dòng mã nguồn int arr[MAX_N]; được tách thành các token int, arr, [, MAX_N, ], ;; sau khi thay thế MAX_N → 100, kết quả in ra là int arr [ 100 ] ; (các token cách nhau đúng 1 khoảng trắng).
Dòng đầu tiên chứa số nguyên n (0≤n≤200) — số lượng macro. n dòng tiếp theo, mỗi dòng có dạng TÊN GIÁ_TRỊ (tên macro và giá trị của nó, cách nhau bởi đúng 1 khoảng trắng; giá trị là một token đơn không chứa khoảng trắng). Tên các macro đôi một khác nhau. Dòng tiếp theo chứa số nguyên m (0≤m≤200) — số dòng mã nguồn. m dòng tiếp theo là các dòng mã nguồn (có thể là dòng rỗng).
In ra đúng m dòng (nếu m=0 thì không in gì), mỗi dòng là kết quả tách token và thay thế macro của dòng mã nguồn tương ứng, các token trong dòng kết quả cách nhau bởi đúng 1 khoảng trắng.
Ví dụ:
Đầu vào:
3
PI 3
MAX_N 100
NAME foo
2
int arr[MAX_N];
double p = PI;
Đầu ra:
int arr [ 100 ] ;
double p = 3 ;
Đầu vào:
1
X 5
1
X+X*X
Đầu ra:
5 + 5 * 5
Đang tải editor...