Trình biên dịch thường lưu bảng ký hiệu dưới dạng bảng băm (hash table) để tra cứu nhanh. Xét một bảng băm gồm m ngăn (bucket), đánh số từ 0 đến m−1, giải quyết đụng độ bằng nối chuỗi (separate chaining). Hàm băm của một định danh (tên) s được định nghĩa là:
hash(s)=(∑c∈sord(c))modm
trong đó ord(c) là mã ASCII của ký tự c.
Bảng nhận vào n lệnh, mỗi lệnh thuộc 1 trong 2 dạng:
insert <name>: nếu name đã có mặt trong bảng (bất kể ở ngăn nào, do trước đó đã insert thành công), in ra DUPLICATE; ngược lại, thêm name vào cuối danh sách liên kết của ngăn hash(name) và in ra OK <bucket> (với <bucket> là chỉ số ngăn đó).find <name>: tính bucket = hash(name), duyệt danh sách liên kết của ngăn đó theo đúng thứ tự đã thêm vào; nếu tìm thấy name, in FOUND <bucket> <pos> với <pos> là vị trí của nó trong danh sách (đánh số từ 0); nếu không thấy, in NOTFOUND <bucket>.Sau khi xử lý xong toàn bộ n lệnh, in thêm đúng m dòng mô tả trạng thái cuối cùng của bảng: dòng thứ i (đánh số từ 0 đến m−1) liệt kê nội dung ngăn i — các tên trong danh sách liên kết theo đúng thứ tự đã thêm, cách nhau bởi dấu phẩy , (không có khoảng trắng); nếu ngăn rỗng, in dấu gạch ngang -.
Ví dụ (m=3,n=4):
insert ab
insert bc
find ab
insert ab
Kết quả:
OK 0
OK 2
FOUND 0 0
DUPLICATE
ab
-
bc
Dòng đầu: hai số nguyên m và n (1≤m≤100, 0≤n≤2000), cách nhau bởi khoảng trắng.
n dòng tiếp theo, mỗi dòng insert <name> hoặc find <name>, name gồm chữ cái thường (độ dài từ 1 đến 20).
n dòng đầu là kết quả của từng lệnh theo đúng thứ tự xử lý. m dòng tiếp theo mô tả nội dung các ngăn theo chỉ số tăng dần từ 0 đến m−1, mỗi ngăn một dòng.
Ví dụ:
Đầu vào:
1 0
Đầu ra:
-
Đầu vào:
3 4
insert ab
insert bc
find ab
insert ab
Đầu ra:
OK 0
OK 2
FOUND 0 0
DUPLICATE
ab
-
bc
Đang tải editor...