trang chủ / bài tập / hashcoll

Bảng băm và va chạm

Đề bài

Mô tả

Một bảng băm gồm h ô được đánh số từ 0 đến h1. Mỗi đối tượng có một định danh id duy nhất và một giá trị băm hash nằm trong đoạn [0,h1].

Khi thêm một đối tượng có giá trị băm t vào bảng, ta thử đặt nó vào ô t. Nếu ô t đã bị chiếm, ta thử ô (t+m)modh, rồi (t+2m)modh, rồi (t+3m)modh, và cứ thế tiếp tục cho tới khi gặp một ô trống. Đối tượng được đặt vào ô trống đầu tiên tìm được.

Nếu đối tượng cuối cùng được đặt vào ô (t+i·m)modh với i0, thì đã có đúng i lần truy cập vô ích (các lần chạm vào ô đã bị chiếm).

Khi xoá một đối tượng khỏi bảng, ô mà nó đang chiếm trở lại trạng thái trống. Thao tác xoá không tính lần truy cập vô ích nào.

Cho một dãy n thao tác thêm và xoá, hãy tính tổng số lần truy cập vô ích. Ban đầu bảng rỗng.

Dữ liệu bảo đảm mọi thao tác thêm đều đặt được đối tượng vào bảng, mọi id của thao tác thêm là phân biệt, và không có thao tác xoá đối tượng không tồn tại.

Dữ liệu vào

  • Dòng đầu chứa ba số nguyên h, m, n: kích thước bảng, bước dò tuyến tính và số thao tác.
  • n dòng tiếp theo, mỗi dòng mô tả một thao tác:
    • + id hash — thêm đối tượng có định danh id và giá trị băm hash.
    • - id — xoá đối tượng có định danh id.

Dữ liệu ra

Một số nguyên duy nhất: tổng số lần truy cập vô ích.

Ràng buộc

  • 1m<h2·105
  • 1n2·105
  • 0id109
  • 0hash<h

Ví dụ

Input Output Giải thích
10 2 7
+ 11 0
+ 22 2
+ 33 6
+ 44 0
+ 55 0
- 22
+ 66 0
7 Đối tượng 11 vào ô 0, 22 vào ô 2, 33 vào ô 6 (chưa có va chạm). Đối tượng 44 xuất phát từ ô 0: các ô 0, 2, 4 lần lượt được thử, ô 0 và 2 đã bị chiếm nên có 2 lần vô ích, 44 vào ô 4. Đối tượng 55 thử 0, 2, 4, 6, 8 và tốn 4 lần vô ích, vào ô 8. Sau khi xoá 22, ô 2 trống trở lại nên đối tượng 66 chỉ tốn 1 lần vô ích (thử ô 0) rồi vào ô 2. Tổng: 0+0+0+2+4+1=7.
5 1 6
+ 123 0
+ 234 1
+ 345 2
- 234
+ 456 0
+ 567 0
4 Ba đối tượng đầu vào các ô 0, 1, 2 không va chạm. Xoá 234 giải phóng ô 1. Đối tượng 456 thử ô 0 (đã chiếm) rồi vào ô 1, tốn 1 lần. Đối tượng 567 thử các ô 0, 1, 2 rồi vào ô 3, tốn 3 lần. Tổng: 1+3=4.
2 1 4
+ 5 1
+ 6 1
- 5
+ 7 1
1 Đối tượng 5 vào ô 1. Đối tượng 6 xuất phát từ ô 1, thử ô 1 (đã chiếm) rồi quay vòng về ô 0, tốn 1 lần. Sau khi xoá 5, ô 1 trống nên đối tượng 7 vào thẳng ô 1.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.400 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.2 gforth 0.7.3 gfortran 12.2.0 go 1.27.0 groovyc 5.1.1 javac 25.0.4 node 26.8.1 julia 1.12.7 kotlinc 2.4.10 lean 4.33.1 sbcl 2.2.9 lua 5.4.9 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.10 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.14.7 racket 8.7 ruby 4.0.6 rustc 1.98.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.3.3 tclsh 8.6 bun 1.4.0 deno 2.9.6 v 0.5.2 zig 0.16.0