트라이 샤딩
시간 제한5초메모리 제한512 MB
주어진 문자열들을 번호가 구분되는 N개 서버에 빈 서버 없이 나누어 전체 트라이 노드 수의 최댓값과 그 경우의 수를 1,000,000,007로 나눈 나머지를 구합니다.
문제
문자열 집합 는 트라이 하나에 모아서 저장할 수 있다. 트라이는 뿌리 있는 트리로, 에 속한 문자열의 서로 다른 접두사마다 노드가 정확히 하나씩 있다. 빈 접두사도 노드 하나를 차지한다.
예를 들어 가 "AAA", "AAB", "AB", "B"이면 트라이의 노드는 7개다. 접두사 "", "A", "AA", "AAA", "AAB", "AB", "B"에 각각 노드가 하나씩 대응한다.
서버 한 대가 전체를 트라이 하나로 들고 있다. 가 너무 커져서 그 서버의 메모리에 들어가지 않으므로 를 서버 대에 나눠 저장한다. 를 서로 겹치지 않고 비어 있지도 않은 부분집합 으로 쪼개고, 번 서버는 에 속한 문자열만 담은 트라이를 만든다. 이렇게 하면 트라이 개의 노드 수 합이 원래 트라이의 노드 수보다 많아지기도 한다. 게다가 문자열이 어떻게 쪼개질지는 정하지 못한다.
같은 문자열 네 개를 서버 두 대에 나눠, 첫째 서버에 "AAA"와 "B"를, 둘째 서버에 "AAB"와 "AB"를 담아 보자. 첫째 트라이는 노드 5개("", "A", "AA", "AAA", "B")가 필요하고 둘째 트라이도 노드 5개("", "A", "AA", "AAB", "AB")가 필요하다. 두 서버가 합쳐서 노드 10개를 쓰는 셈이고, 한 대에 넷을 모두 담을 때 필요한 7개보다 많다.
와 이 주어질 때 쪼개는 방법이 만들 수 있는 노드 수 합의 최댓값과, 그 최댓값에 도달하는 방법의 수를 구하라. 서버는 서로 구별한다. 어떤 문자열이 한 방법에서는 에 들어가고 다른 방법에서는 ()에 들어가면 두 방법은 서로 다르다. 방법의 수는 1,000,000,007로 나눈 나머지를 구한다.
입력
첫 줄에 테스트 케이스 수 가 주어진다. 각 테스트 케이스의 첫 줄에는 두 정수 과 이 공백을 사이에 두고 주어진다. 이어지는 개의 줄에 에 속한 문자열이 한 줄에 하나씩 주어진다.
제한
- 의 문자열은 길이가 1 이상 100 이하이고 영어 대문자로만 이루어진다.
- 의 문자열은 모두 서로 다르다.
출력
각 테스트 케이스마다 "Case #i: X Y" 형식으로 한 줄씩 출력한다. 는 1부터 시작하는 테스트 케이스 번호, 는 트라이 개의 노드 수 합의 최댓값, 는 노드 수 합이 가 되는 방법의 수를 1,000,000,007로 나눈 나머지다.