D - Separation and Union

2 secs 1024 MB
matcharate12's icon matcharate12

この問題はbit全探索を問います。

文字列を選ぶのは 2N2^N 通りあります。これは N16N\le 16 よりbit全探索で探索することが可能です。
さらにそのうちの文字を選び取って組み合わせる操作は「適当に組み合わせる」操作なので、どのような順番で文字を選び取っても構いません。
これは文字を組み合わせた結果が選び取った各文字の個数のみに依存することを表します。

よって SS に含まれる各文字の個数 sl (1l26)s_l\ (1\le l\le 26)※ を数え、TT から選び取った各文字を個数 tlt_l として数え、すべての ll に対し sltls_l\le t_l を満たすかどうか調べればよいです。どのような場合だとしても、そのような ll が存在しないなら答えは -1 です。

以上から O(S+2NNmax(Ti))O(|S|+2^NN\max (|T_i|)) で解くことが可能です( X|X| は文字列 XX の長さを表します)。以下、解答例(C++,Python)です。

※ 英小文字は 2626 種類あるためです。また a はASCIIコード 9797 に相当するので、各文字のASCIIコード AA とすると l=A97l'=A-97 が成り立ちます。しかしこれは 0-indexed の時であり、上の場合では 1-indexed なので l=A96l=A-96 が成り立ちます。