Khi trình biên dịch cấp phát địa chỉ (offset) cho các trường trong một bản ghi (record/struct), mỗi trường phải được đặt ở một địa chỉ căn chỉnh (aligned) theo kích thước của chính nó: offset của một trường kích thước s byte phải là bội số của s. Ngoài ra, tổng kích thước cuối cùng của bản ghi phải là bội số của kích thước lớn nhất trong số các trường (để mảng các bản ghi này cũng được căn chỉnh đúng).
Cho n trường theo đúng thứ tự khai báo trong bảng ký hiệu, trường thứ i có tên name_i và kích thước size_i byte (sizei∈{1,2,4,8}). Hãy tính offset (địa chỉ tương đối so với đầu bản ghi, bắt đầu từ 0) của từng trường theo thuật toán sau, xử lý tuần tự từng trường theo đúng thứ tự khai báo:
Ví dụ (n=3): a 1, b 4, c 2 → offset lần lượt là 0, 4, 8; tổng kích thước bản ghi = 12 (căn theo bội số của 4).
Dòng đầu: số nguyên n (1≤n≤1000).
n dòng tiếp theo, mỗi dòng <name> <size>, size ∈{1,2,4,8}, name không trùng nhau.
n dòng đầu: <name> <offset> theo đúng thứ tự khai báo.
Dòng cuối cùng: một số nguyên — tổng kích thước bản ghi sau khi đã căn chỉnh.
Ví dụ:
Đầu vào:
3
a 1
b 4
c 2
Đầu ra:
a 0
b 4
c 8
12
Đầu vào:
1
x 8
Đầu ra:
x 0
8
Đang tải editor...