Cài đặt bảng ký hiệu bằng bảng băm kích thước m (các chỉ số slot từ 0 đến m−1), sử dụng hàm băm đa thức cơ số 31:
h(name)=(∑i=0L−1ord(name[i])⋅31i)modm
trong đó name[i] là ký tự thứ i (0-based, tính từ trái) của tên biến, ord là mã ASCII, và L là độ dài tên.
Chèn lần lượt n tên biến theo thứ tự cho trước, dùng dò tuyến tính (linear probing): xét lần lượt các slot h(name), h(name)+1, h(name)+2, ... (theo modulo m, quay vòng) cho tới khi:
DUPLICATE).Định nghĩa số bước dò (probe count) của một lần chèn là tổng số slot đã kiểm tra, tính cả slot cuối cùng (nơi đặt vào hoặc nơi phát hiện trùng). Ví dụ nếu chèn thành công ngay tại slot đầu tiên h(name) (trống), probe count =1.
Giả thiết m luôn đủ lớn để bảng không bao giờ đầy trước khi hoàn tất n lần chèn (không cần xử lý trường hợp bảng đầy — dữ liệu vào luôn đảm bảo điều này).
Ví dụ: n=3,m=5, các tên ab, ba, ab. Ta có h(ab)=97+98⋅31=3135mod5=0: slot 0 trống → đặt, probes=1. h(ba)=98+97⋅31=3105mod5=0: slot 0 đã bị ab chiếm (khác tên) → thử slot 1, trống → đặt, probes=2. Tên ab thứ hai: slot 0 chứa đúng ab → DUPLICATE, probes=1.
Dòng đầu tiên chứa hai số nguyên n m (1≤n≤2000, 1≤m≤10007).
n dòng tiếp theo, mỗi dòng là một tên biến (chuỗi chữ cái hoa/thường, chữ số, dấu gạch dưới, độ dài 1..30, không bắt đầu bằng chữ số).
In n dòng, dòng thứ i ứng với tên thứ i trong input:
name SLOT s PROBES p.name DUPLICATE PROBES p.Ví dụ với input nêu trên, output là:
ab SLOT 0 PROBES 1
ba SLOT 1 PROBES 2
ab DUPLICATE PROBES 1
Ví dụ:
Đầu vào:
1 1
solo
Đầu ra:
solo SLOT 0 PROBES 1
Đầu vào:
3 5
ab
ba
ab
Đầu ra:
ab SLOT 0 PROBES 1
ba SLOT 1 PROBES 2
ab DUPLICATE PROBES 1
Đang tải editor...