완전 해시
시간 제한1초메모리 제한128 MB
각 줄에 주어진 단어 13개 이하에 대해, 해시 floor(C/w) mod n이 충돌하지 않게 하는 가장 작은 양의 정수 C를 찾아 입력 줄을 그대로 출력한 뒤 C를 출력한다.
문제
Perfect Software, Inc.는 고속 네트워크를 흐르는 텍스트에서 특정 단어가 나타나는지 검사하는 정부 계약을 맡았습니다. 이 시스템은 각 단어를 여러 개의 작은 완전 해시 테이블(perfect hash table) 과 대조하며, 여러분이 할 일은 각 테이블에 대한 완전 해시 함수를 만드는 것입니다.
완전 해시 함수는 모든 입력을 빈틈없이 꽉 찬 테이블로 곧바로 대응시킵니다(충돌도 없고 빈 칸도 없습니다). 해시 함수의 형태는 이며, 여기서:
- 는 여러분이 찾아야 하는 양의 정수이고,
- 는 입력 단어의 정수 표현이며,
- 은 테이블의 길이(목록에 있는 단어의 개수)입니다.
는 가능한 한 작아야 합니다. 여기서 는 의 바닥 함수로, 이하인 가장 큰 정수를 뜻합니다.
찾기. 단어 값들을 라 하고 이 되도록 정렬했다고 합시다. 다음을 만족하는 가장 작은 양의 정수 를 찾으세요.
이러한 가장 작은 는 항상 의 원소 중 적어도 하나의 배수입니다.
유용한 관찰: 어떤 쌍 에 대해 (충돌)이 성립하면, 가 적어도
에 도달하기 전까지는 두 바닥 값 중 어느 것도 바뀌지 않으므로, 그보다 작은 로는 이 충돌을 해소할 수 없습니다. 모든 충돌을 해소해야 하므로, 현재의 모든 충돌에 대한 이 한계값들 중 가장 큰 값으로 를 건너뛴 뒤 다시 검사하는 것이 효율적입니다.
단어 인코딩. 각 단어를 왼쪽에서 오른쪽으로 글자 단위로 처리하여 숫자로 바꿉니다. 'a'는 1, 'b'는 2, , 'z'는 26으로 두고, 글자마다 5비트를 사용합니다(다음 글자를 더하기 전에 왼쪽으로 5비트 이동, 즉 32를 곱합니다). 따라서 'a' , 'bz' 입니다.
입력
입력은 한 줄에 하나씩 주어지는 단어 목록들의 나열이며, 파일 끝(EOF)에서 끝납니다. 각 줄은 소문자 다섯 글자 이하의 단어 2개 이상 13개 이하로 이루어지며, 단어들은 하나 이상의 공백으로 구분됩니다. 각 줄에는 항상 한 글자짜리 단어가 적어도 하나 있습니다.
출력
각 단어 목록마다 입력 줄을 그대로 출력하고, 다음 줄에 그 목록의 해시 함수에 대한 값을 출력합니다. 연속한 목록의 답 사이에는 빈 줄을 하나 출력합니다. 는 항상 부호 있는 32비트 정수 범위에 들어갑니다.