쿠쿠 해싱
시간 제한2초메모리 제한128 MB
두 해시 테이블에 뻐꾸기 해싱 규칙에 따라 값을 차례로 삽입하고 최종 저장 상태를 출력합니다.
문제
정수 해시 테이블은 정수의 삽입, 삭제, 조회를 상수 시간에 지원하는 자료구조다. 전통적인 해시 구조는 크기가 인 배열 하나와 해시 함수 로 이루어지고, 해시 함수로는 보통 을 쓴다. 값 를 넣을 때는 해시값 를 계산해 그 번호의 칸에 를 저장한다. 예를 들어 이고 테이블 크기가 이면 는 번 칸에 들어간다. 물론 그 칸에 이미 다른 값이(예를 들어 ) 들어 있을 수 있고, 이것을 충돌이라고 한다. 충돌을 처리하는 방법은 여러 가지지만 이 문제에서는 다루지 않는다.
쿠쿠 해싱은 해시 테이블 두 개 과 를 쓰고, 각 테이블이 자기 해시 함수 와 를 갖는 방식이다. 값 는 다음 순서로 삽입한다. 먼저 의 번 칸에 를 넣어 본다. 그 칸이 비어 있으면 거기에 를 저장하고 끝난다. 비어 있지 않으면 충돌을 처리해야 한다. 그 칸에 들어 있던 값을 라고 하자. 의 그 칸을 로 덮어쓴 다음, 이번에는 를 의 번 칸에 넣어 본다. 여기서도 칸이 비어 있으면 를 저장하고 끝난다. 비어 있지 않으면 그 칸에 있던 값 를 로 덮어쓰고, 다시 를 의 번 칸에 넣어 본다. 이렇게 빈 칸을 찾을 때까지 두 테이블을 오간다. 실제 구현이라면 교체 횟수가 일정 수를 넘었을 때 두 테이블을 재해싱하지만, 이 문제에서는 그런 일이 일어나지 않는다. 즉 삽입할 때마다 빈 칸을 반드시 찾는다.
두 테이블의 크기와 삽입할 값이 순서대로 주어질 때, 각 테이블의 최종 상태를 구하여라.
쿠쿠 해싱이라는 이름은 뻐꾸기의 습성에서 왔다. 뻐꾸기는 다른 새의 둥지에 자기 알을 낳고, 먼저 부화한 덩치 큰 뻐꾸기 새끼는 나머지 새끼를 둥지 밖으로 밀어내 먹이를 독차지한다. 잔인하지만 효율적이다.
입력
입력은 여러 테스트 케이스로 이루어진다. 각 테스트 케이스는 양의 정수 세 개 , , 으로 시작한다. 과 는 각각 테이블 과 의 크기이고, 은 삽입 횟수다. 그 뒤에 삽입할 정수 개가 삽입 순서대로 주어지며, 모두 음이 아닌 정수다. 두 테이블은 처음에 비어 있고, 테이블 는 해시 함수 를 쓴다. 0이 세 개 있는 줄이 나오면 입력이 끝나며, 이 줄은 테스트 케이스가 아니다.
제한: ,
출력
각 테스트 케이스마다 먼저 Case k:를 한 줄에 출력한다. 는 1부터 시작해 테스트 케이스마다 1씩 커지는 번호다. 그다음 에 값이 하나라도 있으면 Table 1을 한 줄에 출력하고, 이어서 비어 있지 않은 칸을 인덱스가 작은 것부터 한 줄에 하나씩 i:v 형식으로 출력한다. 는 칸의 인덱스, 는 그 칸에 저장된 값이다. 도 같은 방식으로 Table 2와 칸 목록을 이어서 출력한다. 어느 테이블이 비어 있으면 그 테이블은 머리글을 포함해 아무것도 출력하지 않는다.