AOJ 2931 - 括弧を語る数 / Parentheses Number (RUPC2019 Day3 B)
解法
まず、順列に逆の情報を持たせます。すなわち、
番目の開き括弧が 番目の閉じ括弧に対応しているとき、 数列の番目の値は である。
というようにします。
すると、スタックを利用して、次のような操作を行うことで、問題の条件を満たす括弧列を作成することができます。
まず、今見ている配列の添え字を、次に出現する閉じ括弧が番目であるとします。
スタックにをプッシュします。と同時に、答えとなる文字列に"("を追加します。
スタックの一番上と、を比較します。数字が同じであれば、スタックからその数字を取り出して捨てます。そして、を1増やして、に")"を追加します。
2の操作が行える限り行います。スタックが空になるか、数字が一致しなくなったら1の操作に戻ります。をすべてプッシュし終えていたら、全ての操作を終了します。
こうしてできたが答えとなります。ただし、スタックの中身が空になっていなければ、問題の条件を満たす文字列が無かったことになり、":("を出力することになります。
感想
括弧列といえばスタックを頭の片隅に入れている気がします。
今回も片隅においてはいたのですが、うまい処理を思いつけずにいたので、先輩にヒントをいただきました。
再帰でやろうとしていたので、こっちの方がおそらくシンプルに実装できたと思います。