毒蛇越狱
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld

题目描述

JOI研究所有条毒蛇,这些毒蛇编号为。每条毒蛇从头到尾被分成L段,每段的颜色为蓝、红中的一种。对于毒蛇i,令为i的二进制展开,若,则毒蛇i的第k段是蓝色的,否则是红色的。
每条毒蛇有一个0到9的整数表示它的毒性。给出一个长度为的字符串,其中字符均在0到9的范围内,第i位字符表示第i-1条毒蛇的毒性。
这些毒蛇移动速度非常快,所以他们经常从JOI研究所逃跑,因此,研究所附近的住户投诉时常看见从研究所逃出的毒蛇。
研究所整理出了Q天来住户的举报清单,第d天的收到的举报是一个长度为L且仅包含0,1,?的字符串T_d
如果T_d的第j个字符为0,这意味着逃跑毒蛇的第j段是蓝色的;
如果T_d的第j个字符为1,这意味着逃跑毒蛇的第j段是红色的;
如果T_d的第j个字符为?,这意味着没有人注意到逃跑毒蛇的第j段是什么颜色的。
研究所保证投诉均为准确的信息,并且根据这些信息,JOI研究所每天会将逃跑的毒蛇全部捕获回来,因此会发生同一条毒蛇在不同日子逃跑的情况。
为了估计逃跑的毒蛇的风险,JOI实验室的执行主任K教授想知道所有可能逃跑的毒蛇的毒性之和。你的任务是编写一个程序,给出Q天的投诉清单,计算每天可能从实验室逃跑的毒蛇的毒性之和。
注意本题空间限制较小。

输入描述:

从标准输入中读取数据。
第一行包括两个整数L,Q,表示毒蛇的颜色段数与收到投诉的天数。
第二行包括一个长度为的字符串S,描述毒蛇的毒性。
接下来Q行,第d+2行有长为L的字符串,表示T_d

输出描述:

输出数据到标准输出中。
输出共Q行,每行一个整数,表示所有可能逃跑的毒蛇的毒性之和。
示例1

输入

复制
3 5
12345678
000
0??
1?0
?11
???

输出

复制
1
10
12
12
36

说明

样例中L=3,共有2^3=8条毒蛇,每条毒蛇分成三段,共有5天收到投诉。
第一天:逃跑的毒蛇只可能是第0条毒蛇,毒性之和为1。
第二天:逃跑的毒蛇只可能是第0,1,2,3条毒蛇,毒性之和为10。
第三天:逃跑的毒蛇只可能是第4,6条毒蛇,毒性之和为12。
第四天:逃跑的毒蛇只可能是第3,7条毒蛇,毒性之和为12。
第五天:逃跑的毒蛇只可能是第0,1,2,3,4,5,6,7条毒蛇,毒性之和为36。
示例2

输入

复制
4 8
3141592653589793
0101
?01?
??1?
?0??
1?00
01?1
??10
????

输出

复制
9
18
38
30
14
15
20
80

备注:

对于所有输入数据,有

 CC-BY-SA,感谢LOJ分享,译文来自 https://loj.ac/problem/2351