競プロでよくある「バランスのとれた括弧列」の定義が壊れがちな話
「空文字列でない」を入れることにしたみたいです(今日のABC-Fもそうでした)。
— きり (@kiri8128) May 10, 2020
PAST中めちゃくちゃ考えましたが、確かにこれで一意になりそうです。https://t.co/Aykgtguv14
なるほどなぁと思ったし周知しておくべきだと思ったので記事にしました。
よくある間違った定義 - 1
バランスのとれた括弧列は以下のいずれかの条件を満たす。
- 空文字列
- バランスのとれた括弧列が存在し、'(',,')'をこの順に結合した文字列
- バランスのとれた括弧列,が存在し、,をこの順に結合した文字列
よくある間違った定義 - 2
バランスのとれた括弧列は以下のいずれかの条件を満たす。
- '()'
- バランスのとれた括弧列が存在し、'(',,')'をこの順に結合した文字列
- バランスのとれた括弧列,が存在し、,をこの順に結合した文字列
Problem G: Flipping Parentheses
正しい定義 - 1
バランスのとれた括弧列は以下のいずれかのルールで構成される。
- 空文字列
- バランスのとれた括弧列が存在し、'(',,')'をこの順に結合した文字列
- バランスのとれた括弧列,が存在し、,をこの順に結合した文字列
正しい定義 - 2
バランスのとれた括弧列は以下のいずれかの条件を満たす空でない文字列である。
- '()'
- バランスのとれた括弧列が存在し、'(',,')'をこの順に結合した文字列
- バランスのとれた括弧列,が存在し、,をこの順に結合した文字列
正しい定義 - 3
バランスのとれた括弧列は以下のいずれかの条件を満たす。
- 空文字列
- バランスのとれた括弧列が存在し、'(',,')'をこの順に結合した文字列
- 空文字列でないバランスのとれた括弧列,が存在し、,をこの順に結合した文字列
正しい定義 - 4
A bracket sequence is called regular if it is possible to obtain correct arithmetic expression by inserting characters "+" and "1" into this sequence.
Codeforcesでよく使われる定義っぽい。
正しい定義 - 5
いっそのこと括弧列を
— てんぷら (@tempura_cpp) May 10, 2020
・'('と')'のみからなり個数が同じ
・すべてのiについて
0~i文字目までの'('の数>=0~i文字目までの')'の数
が成り立つ
にしちゃえばいいんじゃないかと思ったり思わなかったりする
何が問題?
集合Sが条件
— きり (@kiri8128) May 10, 2020
∀s ∈ S
(sは空文字列) or (∃A, B ∈ S, s.t. s = A + B) or (∃A ∈ S s.t. s = "(" + A + ")" )
を満たすとき、Sを「括弧の対応が取れている文字列」と定義しています。
例えばSとして「 "(" と ")" からなる任意の文字列(空集合も含む)」を取っても条件を満たします。
要するに、条件を満たす文字列集合が複数存在するのが問題です。
定義3は本当に正しい?
定義3を満たす集合の要素は定義5を満たすことを確認しましょう。
こういうのの典型テクとして、定義3を満たす集合のある要素が定義5を満たさないとして、満たさない最短の要素を持ってきて矛盾を導くというのがあります。こうすると、それより短い要素は定義5を満たしていることになります。
この最短の要素が定義3のどの条件を満たすかで場合分けします。
1) 空文字列
これは明らかに定義5を満たしています。
2) (A)
Aは定義5を満たすので、括弧の数は対応が取れています。また、
「0~i文字目までの'('の数」 == 「Aの0~i-1文字目までの'('の数 + 1」 >= 「Aの0~i-1文字目までの')'の数 + 1」 == 「0~i文字目までの')'の数 + 1」 > 「0~i文字目までの')'の数」
となるので、(A)も定義5を満たします。
3) AB
これも定義5を満たします。(証明は読者の演習問題とする。)(書くのが面倒になった。)
以上から、定義5を満たさない最短の要素は、定義3のどの条件を満たすとしても定義5を満たしてしまうので矛盾が導けました。したがって、定義3を満たす集合の要素は定義5を満たします。
逆に、定義5を満たす文字列の集合は定義3を満たすことを示す必要がありますが、面倒になったのでこれも読者の演習問題とします。
感想
正しい問題文を書くの難しい。。。
追記:正しい定義 - 6
「() を消すことを0回以上繰り返して空文字列にできる」
— maspy (@maspy_stars) May 11, 2020
が、場合分けもなく文章も短くて、人間の手による括弧列の評価とも対応しているので、個人的に推しておきます。
普段、ルールで構成できているかよりも、正しく計算できるかで認識していそうじゃないですか?