競プロキャンプ2026関東
コンテスト日時
2026/06/07 (Su) 09:15 - 11:15

F - Binary String Generators

Earlgray
4
s
1024
MB
100

問題文

0,1,? からなる長さ $N$ の文字列が $M$ 個与えられます。 $i$ $(1 \le i \le M)$ 番目の文字列を $S_i$ とします。

$1 \le i \le M$ を満たす $i$ を $1$ つ選び、 $S_i$ に含まれる各 ? を独立に 0 または 1 に置き換えて、 0,1 からなる長さ $N$ の文字列 $T$ を作ります。

この方法で作ることができる 0,1 からなる長さ $N$ の文字列 $T$ は、重複を除いて全部で何通りありますか?

形式的な説明

(この説明は、問題文の内容をより厳密に定義するためのものです。通常は問題文本文だけを読めば十分です。)

$S_i$ から作ることができる 0,1 からなる長さ $N$ の文字列 $T$ は、すべての位置 $j$ $(1 \le j \le N)$ について、次の条件を満たします。

  • $S_i$ の $j$ 文字目が 0 なら、$T$ の $j$ 文字目も 0 である
  • $S_i$ の $j$ 文字目が 1 なら、$T$ の $j$ 文字目も 1 である
  • $S_i$ の $j$ 文字目が ? なら、$T$ の $j$ 文字目は 0,1 のどちらでもよい

$1 \le i \le M$ を満たす少なくとも $1$ つの $i$ について $S_i$ から作れるような、0,1 からなる長さ $N$ の文字列 $T$ は全部で何通りあるかを求めてください。

つまり、同じ文字列 $T$ が複数の $S_i$ から作れる場合でも、その文字列は答えでは $1$ 通りとして数えます。


より形式的には、各 $i$ について、集合 $A_i$ を次のように定義します。

$A_i$ は、$S_i$ から作ることができる長さ $N$ の 0,1 文字列 $T$ 全体の集合です。ここで $T$ は、$S_i$ の 0,1 が書かれている位置ではその文字と一致し、? が書かれている位置では 0,1 のどちらでもよいものとします。

$$A_i:=\left\lbrace T\in\left\lbrace\colorbox{lightgray}{\color{black}\texttt{0}},\colorbox{lightgray}{\color{black}\texttt{1}}\right\rbrace^N\mathrel{}\middle|\mathrel{}\forall j\ (1 \le j \le N),\ S_i[j]\ne \colorbox{lightgray}{\color{black}\texttt{?}}\Rightarrow T[j]=S_i[j]\right\rbrace.$$

ここで $\colorbox{lightgray}{\color{black}\texttt{0}},\colorbox{lightgray}{\color{black}\texttt{1}},\colorbox{lightgray}{\color{black}\texttt{?}}$ は文字、 $S_i[j]$ は $S_i$ の $j$ 文字目、 $T[j]$ は $T$ の $j$ 文字目を表します。

求める値は、次の和集合の要素数です。

$$\left|A_1\cup A_2\cup\cdots\cup A_M\right|.$$

つまり、同じ文字列 $T$ が複数の集合 $A_i$ に含まれる場合でも、和集合の要素としては $1$ 個として数えます。

制約

  • $1 \leq N \leq 60$
  • $1 \leq M \leq 100$
  • $0 \leq K \leq 400$ (ただし、 $K$ は $S _ 1,S _ 2,\ldots ,S _ M$ に含まれる ? の総数)
  • $N,M$ は整数
  • $S_i$ は 0,1,? からなる長さ $N$ の文字列

入力

$N$ $M$
$S _ 1$
$S _ 2$
$\vdots$
$S _ M$

出力

何通りの文字列が作れるかを整数で出力してください。

入力例 1
3 3 000 101 1??
出力例 1
5

000,100,101,110,111 の $5$ 通りが作れます。

入力例 2
5 5 0000? 000?0 00?00 0?000 ?0000
出力例 2
6

00000,00001,00010,00100,01000,10000 の $6$ 通りが作れます。

入力例 3
60 1 ????????????????????????????????????????????????????????????
出力例 3
1152921504606846976

答えは $2^{60}$ に等しいです。

入力例 4
59 9 11111111111111111111111111111111111111111111111111111111111 ?1?0???0?0000???0000?0000??0000???000???0000??000??0???0?1? 11?0???0?0???0?0?????0???0?0???0?0???0?0?????0???0?00??0?11 ?1?0???0?0???0?0?????0???0?0???0?0???0?0?????0???0?0?0?0?1? 11?0???0?0000??0?????0000??0000??0???0?0?????0???0?0??00?11 ?1??0?0??0?0???0?????0?????0?0???0???0?0?????0???0?0???0?1? 11??0?0??0??0??0?????0?????0??0??0???0?0?????0???0?0???0?11 ?1???0???0???0??0000?0?????0???0??000???0000??000??0???0?1? 11111111111111111111111111111111111111111111111111111111111
出力例 4
6400315125761
入力例 5
59 13 11111111111111111111111111111111111111111111111111111111111 0???0?0???0??000??0000??0000???000???0000??000??0???0?0000? 0??0???0?0??0???0?0???0?0???0?0???0?0?????0???0?00?00?0???0 000?????0???0???0?0000??0000??0???0?0?????00000?0?0?0?0000? 0??0????0???0???0?0?????0??0??0???0?0?????0???0?0???0?0???? 0???0???0????000??0?????0???0??000???0000?0???0?0???0?0???? 11111111111111111111111111111111111111111111111111111111111 ???????000???000???000???000??00000??000???0000?00000?????? ??????0???0?0??00?0???0?0?????0?????0???0?0???????0???????? ?????????0??0?0?0????0??0000??0000??00000??000????0???????? ???????00???00??0??00???0???0?0?????0???0?????0???0???????? ??????00000??000??00000??000??00000?0???0?0000????0???????? 11111111111111111111111111111111111111111111111111111111111
出力例 5
114204101240833
提出
C++23 (g++ 12.2.0)