아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

문자열 묶기

면접 대비

시간 제한20초메모리 제한1024 MB

요약
N개의 문자열을 정확히 K개씩 묶을 때 각 그룹의 최장 공통 접두사 길이 합이 최대가 되도록 묶는 문제다.
난이도

보통10점 중 7점

유형
트라이, 트리, 그리디, DFS
정답자
아직 제출이 없습니다

문제

Pip은 N개의 문자열을 가지고 있다. 각 문자열은 A부터 Z까지의 알파벳 대문자로만 이루어져 있다. Pip은 이 문자열들을 크기 K의 그룹으로 묶으려고 한다. 각 문자열은 정확히 하나의 그룹에 속해야 한다.

한 그룹의 점수는 그 그룹에 속한 모든 문자열이 공통으로 가지는 가장 긴 접두사의 길이와 같다. 예를 들어:

  • 그룹 {RAINBOW, RANK, RANDOM, RANK}의 점수는 2이다 (가장 긴 공통 접두사는 'RA').
  • 그룹 {FIRE, FIREBALL, FIREFIGHTER}의 점수는 4이다 (가장 긴 공통 접두사는 'FIRE').
  • 그룹 {ALLOCATION, PLATE, WORKOUT, BUNDLING}의 점수는 0이다 (가장 긴 공통 접두사는 "").

Pip이 문자열을 크기 K의 그룹으로 묶을 때 그룹 점수의 합이 최대가 되도록 도와주자.

입력

입력의 첫 줄에는 테스트 케이스의 수 T가 주어진다. 그다음 T개의 테스트 케이스가 이어진다. 각 테스트 케이스는 두 정수 N과 K가 주어지는 줄로 시작한다. 그다음 N개의 줄에 걸쳐 Pip의 문자열이 하나씩 주어진다.

출력

각 테스트 케이스마다 Case #x: y 형식의 줄을 하나씩 출력한다. 여기서 x는 테스트 케이스 번호(1부터 시작)이고, y는 가능한 점수 합의 최댓값이다.

제한

  • 1 ≤ T ≤ 100.
  • 2 ≤ N ≤ 105.
  • 2 ≤ K ≤ N.
  • K는 N을 나눈다.
  • Pip의 각 문자열은 적어도 하나의 문자를 포함한다.
  • 각 문자열은 A부터 Z까지의 알파벳 대문자로만 이루어져 있다.

예제2

  1. 예제 1

    입력
    2
    2 2
    KICK
    START
    8 2
    G
    G
    GO
    GO
    GOO
    GOO
    GOOO
    GOOO
    
    예상 출력
    Case #1: 0
    Case #2: 10
    
  2. 예제 2

    입력
    1
    6 3
    RAINBOW
    FIREBALL
    RANK
    RANDOM
    FIREWALL
    FIREFIGHTER
    
    예상 출력
    Case #1: 6