题目描述
对于变量的赋值语句,箭头是一种常用的表达方式。
给一个长度为 n 的序列 a,定义下面两种箭头语句:
- au←v:把 au 赋值为 v,语句的值为 v。
- v→au:把 au 赋值为 v,语句的值为 v。
进而可以定义嵌套的箭头语句,令 A,B 分别是一个语句:
- A←B:先计算 B,并令答案为 q。接下来计算 A,并令答案为 ap,此时计算 A 带来的副作用不会影响 q 的值。最后执行语句 ap←q,整体语句的值就是 ap←q 的值。
- A→B:先计算 A,并令答案为 p。接下来计算 B,并令答案为 aq,此时计算 B 带来的副作用不会影响 p 的值。最后执行语句 p→aq,整体语句的值就是 p→aq 的值。
比如语句 (ai→aj)←(ak→al) 会被解析为依次执行 ak→al,ai→aj,aj←al 三个语句。
现在给你一个长度为 n 的箭头语句,第 i 个操作数是 ai,你需要给它加括号规定优先级,问最终能得到多少种答案。
具体形式可以参考样例解释。
输入格式
第一行一个个正整数 n。
第二行 n 个正整数,表示序列 a。
第三行 n−1 个正整数,保证每个数都是 0 或 1。第 i 个正整数若为 0 则表示第 i 个操作数和第 i+1 个操作数之间有一个 ←,否则有一个 →。
输出格式
一行一个正整数,表示最终能得到多少种答案。
样例组 #1
样例组下载:Download。
输入样例 #1
输出样例 #1
样例解释
原始表达式:a1←a2→a3→a4←a5
答案只可能是 1 或 2,下面分别给出一种可能的加括号方式:
- ((a1←a2)→(a3→a4))←a5=1。
- (a1←a2)→(a3→(a4←a5))=2。
样例组 #2
样例组 #3
样例组 #4
样例组 #5
数据范围
各测试点分数等分。
- 对于测试点 1∼5,保证 n≤10。
- 对于测试点 6∼10,保证所有箭头的方向都一样。
- 对于测试点 11∼15,保证所有相邻的箭头的方向都不一样。
- 对于测试点 16∼20,无特殊限制。
对于全部数据,2≤n≤5×105,1≤ai≤109。