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] Gợi ý sửa định danh sai (did-you-mean) bằng khoảng cách Levenshtein

    Một kỹ thuật phục hồi lỗi ngữ nghĩa phổ biến khi trình biên dịch gặp một định danh chưa khai báo là gợi ý định danh gần đúng nhất có trong bảng ký hiệu (giống thông báo "did you mean ...?" của nhiều trình biên dịch hiện đại), dựa trên khoảng cách chỉnh sửa Levenshtein: số phép chèn, xóa, thay thế ký tự tối thiểu để biến chuỗi này thành chuỗi kia.

    Cho bảng ký hiệu gồm nnn định danh hợp lệ, và mmm định danh bị báo lỗi "chưa khai báo". Với mỗi định danh lỗi xxx, xét tất cả định danh yyy trong bảng ký hiệu, tính khoảng cách Levenshtein d(x,y)d(x,y)d(x,y). Gọi t=⌊∣x∣/2⌋t = \lfloor |x| / 2 \rfloort=⌊∣x∣/2⌋ (với ∣x∣|x|∣x∣ là độ dài xxx) là ngưỡng chấp nhận.

    • Nếu tồn tại ít nhất một yyy với d(x,y)≤td(x,y) \le td(x,y)≤t: chọn yyy có d(x,y)d(x,y)d(x,y) nhỏ nhất; nếu có nhiều yyy cùng đạt khoảng cách nhỏ nhất, chọn yyy nhỏ nhất theo thứ tự từ điển (so sánh chuỗi thông thường).
    • Nếu không có yyy nào thỏa: không có gợi ý.

    Ví dụ: bảng ký hiệu {\{{counter, total, result}\}}, định danh lỗi countr (độ dài 6, ngưỡng t=3t=3t=3). Khoảng cách đến counter là 1 (thiếu một ký tự e) — nhỏ nhất và ≤3\le 3≤3 → gợi ý counter.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (0≤n≤5000 \le n \le 5000≤n≤500).
      • Dòng 2: nnn định danh trong bảng ký hiệu, cách nhau khoảng trắng (dòng rỗng nếu n=0n=0n=0); mỗi định danh chỉ gồm chữ cái/số/gạch dưới, độ dài từ 1 đến 30.
      • Dòng 3: số nguyên mmm (1≤m≤2001 \le m \le 2001≤m≤200).
      • Dòng 4: mmm định danh bị báo lỗi, cách nhau khoảng trắng.
    • Định dạng đầu ra:

      In ra mmm dòng theo đúng thứ tự các định danh lỗi trong dữ liệu vào. Với mỗi định danh xxx: nếu tìm được gợi ý yyy, in x -> y; nếu không, in x -> none.

    Ví dụ:

    Đầu vào:

    3
    counter total result
    2
    countr toatl
    

    Đầu ra:

    countr -> counter
    toatl -> total
    

    Đầu vào:

    2
    foo bar
    1
    xyzxyzxyz
    

    Đầu ra:

    xyzxyzxyz -> none
    

    Đang tải editor...