만드는 중입니다

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

큐브워드

시간 제한1.1초메모리 제한512 MB

요약
주어진 단어 목록으로 정육면체의 12개 모서리를 모두 채우는 크로스워드의 개수를 998244353으로 나눈 나머지로 구합니다.
난이도

보통10점 중 7점

유형
해시맵, 문자열, 조합론
정답자
아직 제출이 없습니다

문제

큐브워드(cubeword)는 특별한 형태의 십자말풀이이다. 큐브워드를 만들려면 먼저 큰 정육면체의 한 변의 길이가 되는 양의 정수 aa를 고른다. 그다음 a×a×aa \times a \times a개의 단위 정육면체로 큰 정육면체를 만든다. 이 큰 정육면체에는 모서리가 12개 있다. 그 후 큰 정육면체의 모서리에 닿지 않는 단위 정육면체는 모두 버린다. 아래 그림은 a=6a = 6일 때 남는 도형이다.

마지막으로 도형에 남은 각 단위 정육면체에 알파벳 하나를 적는다. 큰 정육면체의 모서리마다 그 위에 놓인 글자를 읽었을 때 의미 있는 단어가 되어야 한다. 모서리는 어느 방향으로 읽어도 되며, 두 방향 중 한쪽에서 의미 있는 단어가 되면 충분하다.

아래 그림은 a=6a = 6인 도형에서 일부 단위 정육면체에 글자가 이미 적힌 상태이다. 세 모서리에서 SUBMIT, ACCEPT, TURING 단어를 읽을 수 있다.

유효한 단어 목록이 주어진다. 각 단어는 큐브워드의 모서리에 몇 번이든 쓰일 수 있다. 만들 수 있는 서로 다른 큐브워드의 개수를 세어 998,244,353998{,}244{,}353으로 나눈 나머지를 구하라. 한 큐브워드를 회전하거나 대칭 이동해서 얻은 큐브워드는 서로 다른 것으로 본다.

입력

첫 줄에 단어의 개수를 나타내는 정수 nn (1≤n≤100,0001 \le n \le 100{,}000)이 주어진다. 이어지는 nn개의 줄에는 큰 정육면체의 모서리에 놓일 수 있는 단어가 한 줄에 하나씩 주어진다. 각 단어의 길이는 3 이상 10 이하이다. 모든 단어는 서로 다르다.

출력

주어진 단어 목록으로 만들 수 있는 서로 다른 큐브워드의 개수를 998,244,353998{,}244{,}353으로 나눈 나머지를 한 줄에 출력한다.

힌트

첫 번째 입력 데이터에서는 모든 모서리에 radar를 놓는 경우만 가능하다.

두 번째 입력 데이터에서는 서로 회전한 관계인 큐브 두 개가 가능하다. 모든 모서리에 robot이 놓이며, 두 큐브는 왼쪽 아래 앞 꼭짓점에 r이 있는지 t가 있는지만 다르다.

세 번째 입력 데이터는 두 번째와 비슷하다. 모서리를 양방향으로 읽을 수 있다는 사실은 답에 영향을 주지 않는다.

네 번째 입력 데이터에서는 모든 모서리에 bob이 놓인 큐브가 하나 있다. 또한 모든 모서리에 baobab이 놓인 큐브가 212=40962^{12} = 4096개 있다. 모서리 12개 각각에서 baobab을 읽는 방향이 두 가지이기 때문이다.

예제5

  1. 예제 1

    입력
    1
    radar
    
    예상 출력
    1
    
  2. 예제 2

    입력
    1
    robot
    
    예상 출력
    2
    
  3. 예제 3

    입력
    2
    FLOW
    WOLF
    
    예상 출력
    2
    
  4. 예제 4

    입력
    2
    baobab
    bob
    
    예상 출력
    4097
    
  5. 예제 5

    입력
    3
    TURING
    SUBMIT
    ACCEPT
    
    예상 출력
    162