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

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

Subsequences

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

요약
길이가 짧은 문자열 20개 이하가 주어질 때, 이들을 이어 붙인 문자열의 서로 다른 부분수열 개수가 짝수인 순열의 수를 센다.
난이도

어려움10점 중 9점

유형
동적 계획법, 조합론, 비트 연산, 수학
정답자
아직 제출이 없습니다

문제

Datastring Research Corporation에서는 문자열 ss의 서로 다른 부분수열의 개수가 짝수일 때 ss를 good하다고 부른다.

문자열 tt가 문자열 ss의 부분수열이라는 것은, ss에서 몇 개의 문자를 지워서 tt를 얻을 수 있다는 뜻이다. ss 자신과 빈 문자열도 ss의 부분수열로 본다. 길이가 ll인 문자열에는 모두 2l2^l개의 부분수열이 있지만, 그중에는 서로 같은 것도 있다. 예를 들어 세 글자 문자열 abbabb의 서로 다른 부분수열은 빈 문자열, aa, bb, abab, bbbb, abbabb로 모두 6개뿐이다.

String Researcher의 책상 위에는 문자열 ss가 놓여 있었고, 그는 이것이 good인지 알아내려 했다. 서로 다른 부분수열의 개수를 세는 일이 지루하다는 것을 깨달은 그는 곧바로 일을 시작하는 대신 도넛과 함께 커피 타임을 가지러 갔다.

돌아와 보니 누군가가 문자열 ss를 N−1N-1번 잘라 NN개의 비어 있지 않은 부분문자열 s1,s2,…,sNs_1, s_2, \dots, s_N으로 만들어 책상 위에 흩어 놓았다. 그리고 그는 처음 문자열 ss를 전혀 기억하지 못한다. 다만 그는 복원한 문자열 sp1sp2…spNs_{p_1}s_{p_2}\dots s_{p_N}이 good이 되도록 하는 순열 p=(p1,…,pN)p = (p_1, \dots, p_N)의 개수가 궁금하다. 순열은 모두 N!N!개 있고, 부분문자열 sis_i가 서로 같더라도 이 순열들은 모두 다른 것으로 센다.

입력

첫째 줄에 부분문자열의 개수 NN이 주어진다 (2≤N≤202 \leq N \leq 20). 다음 NN개의 줄 중 ii번째 줄에 부분문자열 sis_i가 주어진다.

모든 sis_i는 비어 있지 않으며 알파벳 소문자로만 이루어져 있다. 모든 sis_i의 길이의 합은 10510^5을 넘지 않는다.

출력

첫째 줄에, 순열의 순서대로 문자열 sis_i를 이어 붙였을 때 good이 되는 순열의 개수를 출력한다.

힌트

문자열 a+a+baaa + a + baa에는 부분수열이 14개, 문자열 a+baa+aa + baa + a에는 13개, 문자열 baa+a+abaa + a + a에는 10개 있다. 부분문자열 aa가 두 번 나타나므로, 이 각각의 문자열은 두 가지 순열로만 얻을 수 있다.

예제1

  1. 예제 1

    입력
    3
    a
    a
    baa
    
    예상 출력
    4