Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Bố trí bộ nhớ bản ghi với căn chỉnh

    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 sss byte phải là bội số của sss. 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 nnn trường theo đúng thứ tự khai báo trong bảng ký hiệu, trường thứ iii có tên name_i và kích thước size_i byte (sizei∈{1,2,4,8}size_i \in \{1,2,4,8\}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:

    1. Gọi cursorcursorcursor là con trỏ cấp phát hiện tại (ban đầu cursor=0cursor = 0cursor=0).
    2. Với trường kích thước sss: nếu cursorcursorcursor chưa là bội số của sss, tăng cursorcursorcursor lên giá trị nhỏ nhất ≥cursor\ge cursor≥cursor là bội số của sss (chèn "padding"). Offset của trường = cursorcursorcursor (sau khi đã căn chỉnh). Sau đó cursor+=scursor \mathrel{+}= scursor+=s.
    3. Sau khi xử lý hết nnn trường, nếu cursorcursorcursor chưa là bội số của sizemax⁡size_{\max}sizemax​ (kích thước lớn nhất trong toàn bộ các trường), tăng cursorcursorcursor lên bội số nhỏ nhất ≥cursor\ge cursor≥cursor của sizemax⁡size_{\max}sizemax​. Giá trị cursorcursorcursor cuối cùng là tổng kích thước bản ghi.

    Ví dụ (n=3n=3n=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).

    • Định dạng đầu vào:

      Dòng đầu: số nguyên nnn (1≤n≤10001 \le n \le 10001≤n≤1000). nnn dòng tiếp theo, mỗi dòng <name> <size>, size ∈{1,2,4,8}\in \{1,2,4,8\}∈{1,2,4,8}, name không trùng nhau.

    • Định dạng đầu ra:

      nnn 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...