AT_ttpc2015_p Dancing stars on regular expression!
Description
[problemUrl]: https://atcoder.jp/contests/ttpc2015/tasks/ttpc2015_p
ここでは、以下の構文で表される文字列を "正規表現" と呼ぶ。
> $ e $ ::= $ a...a $ | ($ e_1 $+$ e_2 $) | ($ e_1 $;$ e_2 $) | \*($ e_1 $) | !($ e_1 $)
ただし、$ a...a $ は 文字 $ a $ の $ 1 $ 回以上の繰り返しによって表せるようなある文字列を表す。
正規表現 $ e $ が表現する文字列の集合 $ L(e) $ は以下で帰納的に定義される。
> $ L(a...a)\ =\ \{a...a\} $ - 例えば、$ L(aa)\ =\ \{aa\} $, $ L(aaa)\ =\ \{aaa\} $。 $ L((e_1+e_2))\ =\ L(e_1)\ ∪\ L(e_2) $ - $ L(e_1) $ に属する または $ L(e_2) $ に属する 文字列 の集合。 $ L((e_1;e_2))\ =\ L(e_1)L(e_2)\ =\ \{\ w_1\ w_2\ |\ w_1\ \in\ L(e_1),\ w_2\ \in\ L(e_2)\ \} $ - $ L(e_1) $ に属する文字列 と $ L(e_2) $ に属する文字列 をつなげた文字列の集合。 $ L(*(e_1))\ =\ L(e_1)^*\ =\ \{ε\}\ ∪\ \{w_1\ |\ w_1\ \in\ L(e_1)\}\ ∪\ ...\ ∪\ \{w_1\ ...\ w_n\ |\ w_1,...,w_n\ \in\ L(e_1)\}\ ∪\ ... $ - $ L(e_1) $ に属する文字列 を 有限回つなげた ($ 0 $ 回の場合も含む) 文字列の集合。 $ L(!(e_1))\ =\ Σ^*\ -\ L(e_1) $ - $ L(e_1) $ に属さない文字列 の集合。
ただし、$ Σ^* $ は文字列の全体集合 $ \{ε(空の文字列),a,aa,aaa,...\}\ =\ ( $a$ を有限個つなげた文字列の集合) $ を表す。
また、以下の文中で"!なし正規表現" とは `!` が出現しない 正規表現 を指し、 "\*なし正規表現" とは `*` が出現しない 正規表現 を指します。
さて、!なし正規表現 $ S $ が与えられます。
$ L(S)\ =\ L(T) $ を満たす \*なし正規表現 $ T $ が存在するかどうか判定してください。
Input Format
入力は以下の形式で標準入力から与えられる。
> $ N $ $ S $
- $ 1 $ 行目には、$ 2 $ 行目に入力される $ S $ の文字列の長さ $ N $($ 1\ ≦\ N\ ≦\ 4000 $) が与えられる。
- $ 2 $ 行目には、ある !なし正規表現 を表す文字列 $ S $ が与えられる。
Output Format
$ L(S)\ =\ L(T) $ を満たす \*なし正規表現 $ T $ が存在する場合、 `YES` を出力してください。
$ L(S)\ =\ L(T) $ を満たす \*なし正規表現 $ T $ が存在しない場合、 `NO` を出力してください。
Explanation/Hint
### Sample Explanation 1
$ T\ =\ (a+aa) $ とすればよい。
### Sample Explanation 2
$ T\ =\ (!(a)+a) $ とすればよい。
### Sample Explanation 3
$ L(S)\ =\ L(T) $ を満たす \\\*なし正規表現 $ T $ は存在しません。