#joi2020yo2e. [joi2020_yo2_e]じゃんけん式 (Rock-Scissors-Paper Expression)

[joi2020_yo2_e]じゃんけん式 (Rock-Scissors-Paper Expression)

問題文

この問題では,じゃんけんの手「グー」「チョキ」「パー」をそれぞれ mathrmR,mathrmS,mathrmP\\mathrm{R}, \\mathrm{S}, \\mathrm{P} で表す.mathrmR\\mathrm{R}mathrmS\\mathrm{S} に勝ち,mathrmS\\mathrm{S}mathrmP\\mathrm{P} に勝ち,mathrmP\\mathrm{P}mathrmR\\mathrm{R} に勝つ.

x,yx, y をじゃんけんの手とするとき,x+y,,xy,,xastyx + y,\\, x - y,\\, x \\ast y を以下のように定める (これらは通常の意味での足し算・引き算・掛け算ではない):

  • x+yx + y は,xneyx \\ne y のとき xxyy のうち勝つ方とし,x=yx = y のとき xx とする.
  • xyx - y は,xneyx \\ne y のとき xxyy のうち負ける方とし,x=yx = y のとき xx とする.
  • xastyx \\ast y は,xneyx \\ne y のとき mathrmR,mathrmS,mathrmP\\mathrm{R}, \\mathrm{S}, \\mathrm{P} のうち xx でも yy でもないものとし,x=yx = y のとき xx とする.

じゃんけんの手と +,,ast+, -, \\ast と括弧からなる式は,以下のように計算する:

  • 括弧の中は先に計算する.例えば,$\\mathrm{R} \\ast (\\mathrm{P} + \\mathrm{S}) = \\mathrm{R} \\ast \\mathrm{S} = \\mathrm{P}$ である.
  • 括弧の深さが同じ部分については,
    • +,+, - より ast\\ast の方を優先して計算する.例えば,$\\mathrm{R} - \\mathrm{P} \\ast \\mathrm{S} = \\mathrm{R} - (\\mathrm{P} \\ast \\mathrm{S}) = \\mathrm{R} - \\mathrm{R} = \\mathrm{R}$ である.
    • 同じ優先順位のもの (++ どうし,\-\- どうし,++\-\-ast\\ast どうし) については,左から順番に計算する.例えば,$\\mathrm{R} - \\mathrm{P} + \\mathrm{S} = (\\mathrm{R} - \\mathrm{P}) + \\mathrm{S} = \\mathrm{R} + \\mathrm{S} = \\mathrm{R}$ である.

JOI さんはあるじゃんけんの式を持っていたが,その式の中の mathrmR,mathrmS,mathrmP\\mathrm{R}, \\mathrm{S}, \\mathrm{P} の一部が見えなくなってしまった.見えなくなってしまった部分が ? で表された長さ NN の文字列 EE が与えられる.JOI さんは,見えなくなってしまった部分のそれぞれに mathrmR,mathrmS,mathrmP\\mathrm{R}, \\mathrm{S}, \\mathrm{P} のいずれかを割り当てる方法であって,式の計算結果が AA になるものが何通りあるかを知りたい.その数は非常に大きくなる可能性があるので,1,000,000,0071\\,000\\,000\\,007 で割った余りを求めたい.

本問で用いられる文法は,BNF (バッカス・ナウア記法) を用いて以下のように表される.じゃんけんの式の一部が見えなくなってしまったものは である.

<expression> ::= <term> | <expression> "+" <term> | <expression> "-" <term>
<term> ::= <factor> | <term> "*" <factor>
<factor> ::= "R" | "S" | "P" | "?" | "(" <expression> ")"

これは例えば,ある文字列が であるとは,「 である」または「 である文字列,+, である文字列,をこの順に連結させたもの」または「 である文字列,-, である文字列,をこの順に連結させたもの」であることである,というように再帰的に定義されることを意味する.

である文字列 EE と計算結果 AA が与えられるので,?mathrmR,mathrmS,mathrmP\\mathrm{R}, \\mathrm{S}, \\mathrm{P} のいずれかを割り当てる方法であって式の計算結果が AA になるものの個数を 1,000,000,0071\\,000\\,000\\,007 で割った余りを求めるプログラムを作成せよ.

制約

  • 1leqqNleqq200,0001 \\leqq N \\leqq 200\\,000
  • EE は長さ NN の文字列である.
  • EE は問題文で定められた である.
  • AAR または S または P である.

小課題

  1. (2020 点) Nleqq15N \\leqq 15
  2. (2020 点) Nleqq200N \\leqq 200
  3. (6060 点) 追加の制約はない.

入力

入力は以下の形式で標準入力から与えられる.

NN EE AA

出力

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


入力例 1

11
S+?-(R+?)*P
S

出力例 1

6

22 箇所の ?mathrmR,mathrmS,mathrmP\\mathrm{R}, \\mathrm{S}, \\mathrm{P} のいずれかを割り当てて計算結果を mathrmS\\mathrm{S} にする方法は,以下の 66 通りがある:

  • $\\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}$

入力例 2

15
?+?-?*?+?-?*?+?
R

出力例 2

2187

入力例 3

13
(((((R)))))+?
P

出力例 3

1

入力例 4

1
P
S

出力例 4

0

入力例 5

27
R+((?+S-?*P+?)-P*?+S-?)*R+?
P

出力例 5

381

入力例 6

83
((R+?)*(?+?))*((?+?)*(?+?))*((?+?)*(?+?))-((S+?)*(?+?))*((?+?)*(?+?))*((?+?)*(?+?))
P

出力例 6

460353133

条件を満たす割り当て方は 10,460,353,20310\\,460\\,353\\,203 通りあるため,それを 1,000,000,0071\\,000\\,000\\,007 で割った余りである 460,353,133460\\,353\\,133 を出力する.