만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

부분 문자열 보내기

시간 제한6초메모리 제한2048 MB

요약
여러 팀 이름이 주어질 때, 서로 다른 두 팀의 이름에 공통으로 나타나는 서로 다른 부분 문자열의 개수를 모든 팀 쌍에 대해 더한 값을 구합니다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 문자열, 트리
정답자
아직 제출이 없습니다

문제

당신은 권위 있는 국제 코드 인쇄 대회(ICPC) 파이널 라운드의 참가자다. 시범 라운드 장소에 도착해 보니, 일반 프로그래밍 대회와 달리 어느 팀이든 다른 어느 팀에게나 인쇄용 코드를 보낼 수 있었다.

주최 측은 종이 비용을 추가로 쓰고 싶지 않고, 문제 풀이 힌트가 숨어 있는지 메시지를 검사하고 싶지도 않다. 그래서 다른 팀에게 텍스트를 인쇄용으로 보내려면 다음 조건을 지켜야 한다.

  • SS를 보내는 팀의 이름, TT를 받는 팀의 이름이라 할 때, 보내는 텍스트는 SS와 TT의 공백이 아닌 부분 문자열이어야 한다.
  • 한 팀은 같은 메시지를 같은 상대 팀에게 두 번 보낼 수 없다.

문제를 푸는 것도 즐겁지만, 상대 팀에게 메시지를 보내는 일도 재미있다. 대회 동안 서로 다른 팀 사이에서 이런 방식으로 전달될 수 있는 메시지의 최대 개수를 구하라.

어떤 메시지가 여러 순서쌍의 팀 사이에서 전달되면, 그 횟수만큼 답에 센다. 팀이 자기 자신에게 인쇄한 메시지는 세지 않는다.

입력

첫 번째 줄에 테스트 케이스의 개수를 나타내는 정수 TT(1≤T≤1051 \leq T \leq 10^5)가 주어진다.

각 테스트 케이스는 팀의 개수를 나타내는 정수 nn(1≤n≤1051 \leq n \leq 10^5)으로 시작한다.

이어지는 nn개의 줄에는 각각 소문자 라틴 알파벳으로만 이루어진 문자열 SS(1≤∣S∣≤1051 \leq |S| \leq 10^5)가 주어진다. 이는 팀의 이름이다. 팀 이름은 중복될 수 있다.

모든 테스트 케이스의 팀 개수 합은 10510^5를 넘지 않고, 모든 팀 이름 길이의 합은 5⋅1055 \cdot 10^5를 넘지 않는다.

출력

각 테스트 케이스마다, 서로 다른 팀 사이에서 전달될 수 있는 메시지의 최대 개수를 나타내는 정수 하나를 출력한다.

힌트

첫 번째 테스트 케이스에서 각 팀은 다른 팀에게 다음 문자열을 보낼 수 있다: a, ab, b, c.

두 번째 테스트 케이스에서 a, d, f, i, m, n, o, re, t, un, um 문자열은 두 가지 방법으로, e, r, s 문자열은 여섯 가지 방법으로, u 문자열은 열두 가지 방법으로 보낼 수 있다.

예제1

  1. 예제 1

    입력
    2
    2
    abacaba
    abc
    5
    dungeonthread
    mediumrare
    bsunumberseven
    sostuffy
    fiksiki
    
    예상 출력
    8
    52