C - 天下一文字列集合 Editorial by kumjin3141


まず、2つの文字列パターン \(X, Y\) の両方を満たす文字列が存在するかどうかは、 \(X_i \neq * \land Y_i \neq * \land X_i \neq Y_i\) を満たす \(i\) が存在しないことと同値なので、 \(O(M)\) で確かめられます。

次に、文字列パターンの集合 \(\{S_1, S_2, \ldots, \, S_a\}\) の全てを満たす文字列が存在するかどうかを考えます。
2つの文字列パターン \(S_i, S_j\) を満たす文字列が存在しない場合、明らかに条件を満たす文字列は存在しません。
逆に、そのような \(i, j\) が存在しない場合、2つの文字列パターンを合体させることを繰り返して、全ての文字列パターンの条件を満たす文字列パターンを作ることができ、条件を満たす文字列が存在することがわかります。
よって、任意の2つの文字列パターンについて、両方を満たす文字列が存在するかを \(O(N^2)\) で前計算しておくことで、任意の文字列パターンの部分集合について、それらの要素全ての条件を満たす文字列が存在するかを、全体で \(O(2^N N^2)\)\(O(2^N N)\) で計算できます。

最後に、 \(dp[T] := T \subset S \text{に限定した時の、問題の答え}\) とした dp をします。
これは、\( T\subset S \)の要素全ての条件を満たす文字列が存在する場合 1, そうでない場合 0 とした配列 \(mg\) を用いて、
\( dp[T] = \min(|T|, \min_{U \subset T}(mg[U] \times dp[U] + 1)) \) として\(O(3^N)\) で計算できます。

以上から、この問題を全体で \(O(3^N)\) で解くことができました。

posted:
last update: