페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#3152

대치동 전쟁 1s 256MB

문제

대치동은 지금 불바다이다.

현서와 민재 사이에서 전쟁이 일어났기 때문이다.

 

현서의 강세가 계속되던 중 민재의 기습전략으로 현서의 최측근이던 택쌤이 민재의 인질로 잡혀 버렸다.

현서는 오른팔인 당신에게 특별 구출대를 구성해서 택쌤을 구해오라는 명령을 내렸다. 

 

당신은 택쌤 구출을 위해 N명의 특공대원 중 몇 명을 골라 구출대를 구성할 수 있다.

특공대원들은 각자 특기에 따라 M개의 기술 중 몇가지를 쓸 수 있다.

(그 기술들은 각각 1부터 M까지 번호가 매겨져 있다.) 

 

현서는 특공대를 구성함에 있어서, 특공대원들이 쓸 수 있는 기술이 특정한 기술들로만 이루어지게 하고 싶다.

특공대의 기술은 특공대원들이 쓸 수 있는 기술의 합집합으로 정의한다.

 

예를 들어 1번 기술(연막탄 뿌리기), 2번 기술(목 비틀어 기절시키기), 3번 기술(540도 이단 돌려차기) 3가지의 기술이 있다고 하자.

 

특공대원은 각각 아래 표와 같은 같은 기술을 쓸 수 있다.

 

 

기술 1

기술 2

기술 3

특공대원 1

가능

가능

불가능

특공대원 2

불가능

가능

가능

특공대원 3

가능

불가능

불가능

특공대원 4

불가능

가능

불가능

​현서는 구성된 특공대의 기술이 {기술 1,기술 2} 이 되기를 원한다.

기술 3이 포함된 특공대원 2는 구출대에 구성될 수 없다.

(이단 돌려차기는 멋있긴 하지만, 기습적인 작전에서는 너무 눈에 띌 것이다.)

 

{특공대원 1, 특공대원 3}을 특공대로 구성하는 것도 한 가지 방법이 될 수 있으며

{특공대원 1} 만을 특공대로 구성하는 것도 역시 한 가지 방법이다.

하지만 {특공대원 3}만을 특공대로 구성하는 것은 불가능하다. 기술 2를 쓸 줄 아는 대원이 없기 때문이다.

 

특공대원들의 정보가 주어질 때, 현서가 원하는 특공대 기술을 이루도록 특공대를 구성하는 모든 경우의 수를 구하는 프로그램을 작성하라.


입력

첫줄에 N과 M이 주어진다.

N은 특공대원의 수이다. M은 사용 가능한 기술의 수이다. 

 

다음 N개의 줄에는 M개의 0과 1로 된 문자가 공백 없이 주어진다.

이는 각 특공대원들의 사용 가능한 기술이다.

구체적으로, x번째 칸이 1이라면, x번 기술을 쓸 줄 안다는 뜻이며, 0이면 모른다는 뜻이다.

예를 들어 01010 이라면, 그 특공대원이 5개의 기술 중 2번과 4번 기술을 쓸 줄 안다는 뜻이다.

 

맨 마지막 줄에 목표하는 특공대 기술이 같은 형식으로 주어진다.

부분문제의 제약 형식

모든 부분문제에서 1≤​N≤​100,000 , 1≤​M≤​20을 만족한다. N과 M은 정수이다.

각 기술 집합은 0과 1로만 이루어져있다.

 

부분문제 1) (16점) N≤​10,M≤​5 를 만족한다.

부분문제 2) (20점) N≤​1000, M≤​5를 만족한다.

부분문제 3) (64점) 주어진 제약 조건 외에 아무 제약조건이 없다.


출력

목표하는 특공대 기술이 나오는 구출대로써 가능한 경우의 수를 출력하라.

답이 너무 큰 경우를 대비하여, 원래의 정답을 10억 7로 나눈 나머지를 출력한다.


예제 #1

4 3

110
011
100
010
110
5

예제 #2

4 2

00
10
01
11
11
10

출처

Hackerrank - Expert Level, 2018camp day1 problem F
로그인해야 코드를 작성할 수 있어요.