AT_joi2020_yo2_e じゃんけん式 (Rock-Scissors-Paper Expression)

Description

[problemUrl]: https://atcoder.jp/contests/joi2020yo2/tasks/joi2020_yo2_e この問題では,じゃんけんの手「グー」「チョキ」「パー」をそれぞれ $ \mathrm{R},\ \mathrm{S},\ \mathrm{P} $ で表す.$ \mathrm{R} $ は $ \mathrm{S} $ に勝ち,$ \mathrm{S} $ は $ \mathrm{P} $ に勝ち,$ \mathrm{P} $ は $ \mathrm{R} $ に勝つ. $ x,\ y $ をじゃんけんの手とするとき,$ x\ +\ y,\,\ x\ -\ y,\,\ x\ \ast\ y $ を以下のように定める (これらは通常の意味での足し算・引き算・掛け算ではない): - $ x\ +\ y $ は,$ x\ \ne\ y $ のとき $ x $ と $ y $ のうち勝つ方とし,$ x\ =\ y $ のとき $ x $ とする. - $ x\ -\ y $ は,$ x\ \ne\ y $ のとき $ x $ と $ y $ のうち負ける方とし,$ x\ =\ y $ のとき $ x $ とする. - $ x\ \ast\ y $ は,$ x\ \ne\ y $ のとき $ \mathrm{R},\ \mathrm{S},\ \mathrm{P} $ のうち $ x $ でも $ y $ でもないものとし,$ x\ =\ y $ のとき $ x $ とする. じゃんけんの手と $ +,\ -,\ \ast $ と括弧からなる式は,以下のように計算する: - 括弧の中は先に計算する.例えば,$ \mathrm{R}\ \ast\ (\mathrm{P}\ +\ \mathrm{S})\ =\ \mathrm{R}\ \ast\ \mathrm{S}\ =\ \mathrm{P} $ である. - 括弧の深さが同じ部分については, - $ +,\ - $ より $ \ast $ の方を優先して計算する.例えば,$ \mathrm{R}\ -\ \mathrm{P}\ \ast\ \mathrm{S}\ =\ \mathrm{R}\ -\ (\mathrm{P}\ \ast\ \mathrm{S})\ =\ \mathrm{R}\ -\ \mathrm{R}\ =\ \mathrm{R} $ である. - 同じ優先順位のもの ($ + $ どうし,$ - $ どうし,$ + $ と $ - $,$ \ast $ どうし) については,左から順番に計算する.例えば,$ \mathrm{R}\ -\ \mathrm{P}\ +\ \mathrm{S}\ =\ (\mathrm{R}\ -\ \mathrm{P})\ +\ \mathrm{S}\ =\ \mathrm{R}\ +\ \mathrm{S}\ =\ \mathrm{R} $ である. JOI さんはあるじゃんけんの式を持っていたが,その式の中の $ \mathrm{R},\ \mathrm{S},\ \mathrm{P} $ の一部が見えなくなってしまった.見えなくなってしまった部分が `?` で表された長さ $ N $ の文字列 $ E $ が与えられる.JOI さんは,見えなくなってしまった部分のそれぞれに $ \mathrm{R},\ \mathrm{S},\ \mathrm{P} $ のいずれかを割り当てる方法であって,式の計算結果が $ A $ になるものが何通りあるかを知りたい.その数は非常に大きくなる可能性があるので,$ 1\,000\,000\,007 $ で割った余りを求めたい. 本問で用いられる文法は,BNF (バッカス・ナウア記法) を用いて以下のように表される.じゃんけんの式の一部が見えなくなってしまったものは <expression> である. ``` ::= | "+" | "-" ::= | "*" ::= "R" | "S" | "P" | "?" | "(" ")" ``` これは例えば,ある文字列が <expression> であるとは,「<term> である」または「<expression> である文字列,`+`,<term> である文字列,をこの順に連結させたもの」または「<expression> である文字列,`-`,<term> である文字列,をこの順に連結させたもの」であることである,というように再帰的に定義されることを意味する. <expression> である文字列 $ E $ と計算結果 $ A $ が与えられるので,`?` に $ \mathrm{R},\ \mathrm{S},\ \mathrm{P} $ のいずれかを割り当てる方法であって式の計算結果が $ A $ になるものの個数を $ 1\,000\,000\,007 $ で割った余りを求めるプログラムを作成せよ.

Input Format

入力は以下の形式で標準入力から与えられる. > $ N $ $ E $ $ A $

Output Format

標準出力に,`?` に $ \mathrm{R},\ \mathrm{S},\ \mathrm{P} $ のいずれかを割り当てる方法であって式の計算結果が $ A $ になるものの個数を $ 1\,000\,000\,007 $ で割った余りを $ 1 $ 行で出力せよ.

Explanation/Hint

### 制約 - $ 1\ \leqq\ N\ \leqq\ 200\,000 $. - $ E $ は長さ $ N $ の文字列である. - $ E $ は問題文で定められた <expression> である. - $ A $ は `R` または `S` または `P` である. ### 小課題 1. ($ 20 $ 点) $ N\ \leqq\ 15 $. 2. ($ 20 $ 点) $ N\ \leqq\ 200 $. 3. ($ 60 $ 点) 追加の制約はない. ### Sample Explanation 1 $ 2 $ 箇所の `?` に $ \mathrm{R},\ \mathrm{S},\ \mathrm{P} $ のいずれかを割り当てて計算結果を $ \mathrm{S} $ にする方法は,以下の $ 6 $ 通りがある: - $ \mathrm{S}\ +\ \mathrm{R}\ -\ (\mathrm{R}\ +\ \mathrm{R})\ \ast\ \mathrm{P} $ - $ \mathrm{S}\ +\ \mathrm{R}\ -\ (\mathrm{R}\ +\ \mathrm{S})\ \ast\ \mathrm{P} $ - $ \mathrm{S}\ +\ \mathrm{S}\ -\ (\mathrm{R}\ +\ \mathrm{R})\ \ast\ \mathrm{P} $ - $ \mathrm{S}\ +\ \mathrm{S}\ -\ (\mathrm{R}\ +\ \mathrm{S})\ \ast\ \mathrm{P} $ - $ \mathrm{S}\ +\ \mathrm{P}\ -\ (\mathrm{R}\ +\ \mathrm{R})\ \ast\ \mathrm{P} $ - $ \mathrm{S}\ +\ \mathrm{P}\ -\ (\mathrm{R}\ +\ \mathrm{S})\ \ast\ \mathrm{P} $ ### Sample Explanation 6 条件を満たす割り当て方は $ 10\,460\,353\,203 $ 通りあるため,それを $ 1\,000\,000\,007 $ で割った余りである $ 460\,353\,133 $ を出力する.