큐브워드
시간 제한1.1초메모리 제한512 MB
주어진 단어 목록으로 정육면체의 12개 모서리를 모두 채우는 크로스워드의 개수를 998244353으로 나눈 나머지로 구합니다.
문제
큐브워드(cubeword)는 특별한 형태의 십자말풀이이다. 큐브워드를 만들려면 먼저 큰 정육면체의 한 변의 길이가 되는 양의 정수 를 고른다. 그다음 개의 단위 정육면체로 큰 정육면체를 만든다. 이 큰 정육면체에는 모서리가 12개 있다. 그 후 큰 정육면체의 모서리에 닿지 않는 단위 정육면체는 모두 버린다. 아래 그림은 일 때 남는 도형이다.

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

유효한 단어 목록이 주어진다. 각 단어는 큐브워드의 모서리에 몇 번이든 쓰일 수 있다. 만들 수 있는 서로 다른 큐브워드의 개수를 세어 으로 나눈 나머지를 구하라. 한 큐브워드를 회전하거나 대칭 이동해서 얻은 큐브워드는 서로 다른 것으로 본다.
입력
첫 줄에 단어의 개수를 나타내는 정수 ()이 주어진다. 이어지는 개의 줄에는 큰 정육면체의 모서리에 놓일 수 있는 단어가 한 줄에 하나씩 주어진다. 각 단어의 길이는 3 이상 10 이하이다. 모든 단어는 서로 다르다.
출력
주어진 단어 목록으로 만들 수 있는 서로 다른 큐브워드의 개수를 으로 나눈 나머지를 한 줄에 출력한다.
힌트
첫 번째 입력 데이터에서는 모든 모서리에 radar를 놓는 경우만 가능하다.
두 번째 입력 데이터에서는 서로 회전한 관계인 큐브 두 개가 가능하다. 모든 모서리에 robot이 놓이며, 두 큐브는 왼쪽 아래 앞 꼭짓점에 r이 있는지 t가 있는지만 다르다.
세 번째 입력 데이터는 두 번째와 비슷하다. 모서리를 양방향으로 읽을 수 있다는 사실은 답에 영향을 주지 않는다.
네 번째 입력 데이터에서는 모든 모서리에 bob이 놓인 큐브가 하나 있다. 또한 모든 모서리에 baobab이 놓인 큐브가 개 있다. 모서리 12개 각각에서 baobab을 읽는 방향이 두 가지이기 때문이다.