Zee 바다의 Zong
시간 제한3초메모리 제한512 MB
각 줄에 물음표가 최대 하나 있는 줄 m개가 주어집니다. 각 줄을 다음 줄로 바꾸는 순열의 개수를 10^9+7로 나눈 나머지로 구합니다.
문제
Unterzee의 동요하지 않는 선장(Imperturbable Captain)은 해적 시인(Pirate-Poet)을 쫓고 있다. 둘의 라이벌 관계는 오래전에 시작되었고, 그 뒤로 끝이 보이지 않는다. 선장이 해적 시인이 있을 것으로 예상된 항구에 도착할 때마다 남는 것은 해적 시인이 며칠 전에 떠났다는 메시지뿐이다. 메시지에는 끝나지 않는 걸작의 새 구절도 함께 적혀 있다. 그 걸작이 Zee 바다의 Zong이다. 선장과 해적 시인 모두 Zong이 완성되면 둘의 라이벌 관계도 끝난다는 것을 안다. 선장이 Zong을 손에 넣으면 해적 시인을 찾아 마지막 대결이 시작된다. 항구를 지나고 구절을 지나간다. 답은 처음부터 거기 있었을지도 모른다. 선장은 자신들이 Zong의 끝을 볼 만큼 오래 살 수 없다는 것을 알고 있으므로, 할 수 있는 일은 해적 시인을 앞서는 것뿐이다. 지금까지 시의 모든 행은 첫 행의 아나그램이다. 선장은 모든 행이 같은 방식으로 얻어졌다고 짐작한다. 고정된 순열 을 이전 행에 적용하는 방식이다. 즉, 새 행의 i번째 문자는 이전 행의 번째 위치에 있던 문자이다. 선장은 의도된 순열을 추측하여 시 전체를 복원하려 한다. 먼저 확인해야 할 후보가 몇 개인지 알고 싶어 한다. 선장은 시의 각 행을 꼼꼼히 옮겨 적었다. m개의 행이고, 각 행은 n개의 Unterzian 문자로 이루어져 있다. 일부 문자는(행마다 많아야 하나) 물음표("?")로 바뀌어 있을 수 있다. 이는 선장이 그 문자가 무엇인지 확신하지 못한다는 뜻이다. 주어진 데이터와 일치하는 순열 의 개수를 세어라. 즉, 모든 "?"를 적당한 Unterzian 문자로 바꾸었을 때 각 행이 이전 행에 이 순열을 적용하여 얻어지는 순열의 개수이다. 답을 로 나눈 나머지를 출력하라. 선장은 이 정보를 어떻게 써야 할지 안다. 아마도.
입력
첫 줄에 두 정수 과 ()이 주어진다. 이어지는 m개 줄의 i번째 줄에는 시의 i번째 행이 주어진다. 각 줄은 정확히 n개의 문자로 이루어지며, 각 문자는 Unterzian 문자이거나 물음표("?")이다. 각 줄에 물음표는 많아야 하나 들어 있다. Unterzian 문자의 ASCII 코드는 33 이상 126 이하이며, 다만 "?"의 코드는 63이다.
출력
문제의 답인 정수 하나를 출력한다.