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

    solution

    Đề bài: [An toàn thông tin] Tính gốc cây Merkle

    Cây Merkle (Merkle tree) là cấu trúc dùng để xác thực toàn vẹn cho một tập hợp dữ liệu lớn (được dùng trong Bitcoin, Git, IPFS, ...) chỉ bằng một giá trị băm duy nhất gọi là Merkle root.

    Cho nnn lá (leaf) là các chuỗi dữ liệu L1,…,LnL_1, \ldots, L_nL1​,…,Ln​. Xây dựng cây Merkle theo quy tắc sau, dùng SHA-256 (biểu diễn hex, chữ thường):

    1. Băm từng lá: hi=SHA256(Li)h_i = \text{SHA256}(L_i)hi​=SHA256(Li​).
    2. Ở mỗi tầng, ghép các node thành từng cặp liên tiếp theo đúng thứ tự: node cha =SHA256(htraˊi∥hphải)= \text{SHA256}(h_{\text{trái}} \Vert h_{\text{phải}})=SHA256(htraˊi​∥hphải​) (nối chuỗi hex).
    3. Nếu tầng hiện tại có số node lẻ, nhân đôi node cuối cùng (dùng chính nó làm cặp với chính nó) trước khi ghép cặp.
    4. Lặp lại cho đến khi chỉ còn một node duy nhất — đó chính là Merkle root.

    Trường hợp đặc biệt: nếu n=1n = 1n=1, Merkle root chính là h1h_1h1​.

    Ví dụ: n=3n = 3n=3 với các lá "a", "b", "c": băm 3 lá được h1,h2,h3h_1, h_2, h_3h1​,h2​,h3​; vì lẻ nên nhân đôi h3h_3h3​ thành (h1,h2,h3,h3)(h_1, h_2, h_3, h_3)(h1​,h2​,h3​,h3​); ghép cặp tầng 1 được 2 node; ghép cặp tiếp được 1 node — đó là kết quả.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (1≤n≤10001 \le n \le 10001≤n≤1000).
      • nnn dòng tiếp theo: nội dung từng lá L1,…,LnL_1, \ldots, L_nL1​,…,Ln​ (có thể là chuỗi rỗng).
    • Định dạng đầu ra:

      In ra duy nhất một dòng: giá trị Merkle root dạng chuỗi hex 64 ký tự thường.

    Ví dụ:

    Đầu vào:

    2
    tx1
    tx2
    

    Đầu ra:

    f8f28ede979567036d801ad6cf58b551c7d8530bba005c48e46d39c73ab52664
    

    Đầu vào:

    1
    A
    

    Đầu ra:

    559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd
    

    Đang tải editor...