AT_joi2020_yo2_e じゃんけん式 (Rock-Scissors-Paper Expression)
题目描述
在这个问题中,我们将"石头"、"剪刀"、"布"分别用符号 $\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 * y$(注意这并不是我们熟悉的加法、减法和乘法,意义如下):
- $x + y$:当 $x \ne y$ 时,取两个中获胜的一项;如果 $x = y$,则取 $x$。
- $x - y$:当 $x \ne y$ 时,取两个中失败的一项;如果 $x = y$,则取 $x$。
- $x * y$:当 $x \ne y$ 时,取 $\mathrm{R},\ \mathrm{S},\ \mathrm{P}$ 中既非 $x$ 也非 $y$ 的符号;如果 $x = y$,则取 $x$。
表达式由手势符号以及 $+,\ -, *$ 和括号组成,并遵循如下计算规则:
- 括号里的内容最优先计算。例如,$\mathrm{R} * (\mathrm{P} + \mathrm{S}) = \mathrm{R} * \mathrm{S} = \mathrm{P}$。
- 在括号深度相同的情况下:
- 优先计算 $*$,再计算 $+$ 和 $-$。例如,$\mathrm{R} - \mathrm{P} * \mathrm{S} = \mathrm{R} - (\mathrm{P} * \mathrm{S}) = \mathrm{R} - \mathrm{R} = \mathrm{R}$。
- 对于相同优先级的运算符,例如 $+$ 与 $+$、$-$ 与 $-$、$+$ 与 $-$、$*$ 与 $*$,依照从左到右的顺序计算。例如,$\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 想知道,如何替换这些 `?` 使得整个表达式的运算结果为 $A$ 的方法有多少种。由于方法数可能极大,要求对 $1\,000\,000\,007$ 取模。
表达式由 BNF (巴科斯-诺尔范式) 定义如下:
```
::= | "+" | "-"
::= | "*"
::= "R" | "S" | "P" | "?" | "(" ")"
```
这意味着,一个字符串是 <expression>,如果它是 <term>;或者是一个 <expression>,后跟 `+` 和一个 <term> 的组合;或是一个 <expression>,后跟 `-` 和一个 <term> 的组合。
现在给你一个 <expression> 类型的字符串 $E$ 和一个结果 $A$,请编写程序计算以不同方式替换 '?' 所形成的表达式 $E$ 的结果为 $A$ 的方案数,并输出该方案数对 $1\,000\,000\,007$ 取模的结果。
输入格式
输入以如下形式给出:
> $ N $ $ E $ $ A $
输出格式
输出一个整数,该整数表示将 `?` 替换为 $\mathrm{R},\ \mathrm{S},\ \mathrm{P}$ 中任意一个,使得表达式计算结果为 $A$ 的方案数量,最后需要对 $1\,000\,000\,007$ 取模。
说明/提示
- $1 \leq N \leq 200\,000$。
- $E$ 是长度为 $N$ 的字符串。
- $E$ 是描述中的 <expression>。
- $A$ 是 $\mathrm{R},\ \mathrm{S},\ \mathrm{P}$ 中的一个字符。
### 子任务
1. (20 分)$N \leq 15$。
2. (20 分)$N \leq 200$。
3. (60 分)无额外限制。
**本翻译由 AI 自动生成**