#P114514. 国会山的陷落

国会山的陷落

背景

川普来了!米利坚太平了!川普来了!青天就有了!某年某月某六号,一个神奇的团体苦米利坚久矣,准备进京勤王,清君侧。国会里的佩洛东慌了,她赶紧逃命,走之前要求小L尽最大努力保住她电脑里的机密文件,就匆匆逃离了现场。可她不知道的是,小L其实是懂王的心腹,是安插在皿煮党身边的一个卧底,并且小L早就知道了佩洛东电脑机密文件的密码的破解方法,为了偷出机密文件,并让更少的人知道此事,以便小L继续潜伏,虽然是一伙的,但小L不能让神奇组织发现小L的事,所以小L时间不多了!于是他打电话向身为计算机高手的你求助,希望你能写出程序,帮助他快速破解密码。

题目描述

密码是一排数字,而随机个数数字上有着黄色的高亮,已知解开密码的方法是:高亮的数字之和在可操作条件下最大,这个最大的数就是密码。小L只能进行将高亮往左滑动一格的操作,一个高亮数字只能移动一次,但是可以移动多个高亮数字,但肉眼观察显然太慢了,所以需要你直接告诉他,可得到的最大数字。

你可能会用到

前缀和:顾名思义,是要求前缀的总和,什么是前缀,对于一个存放数字的数组而言,前缀就是指的数组的前k项,因此对应的前缀和就是数组前k项的和。前缀和一般用来求数组中连续段子数组的值的和,类似于等差数列中利用等差数列的和来求某一段子数列的和,对于一个前缀和处理过的数组:

求原数组第i个数字通过公式:x=a[i]-a[i-1];

求原数组第i到第j个数字的和通过公式:x=a[j]-a[i-1];

(此处的a[]数组,代表前缀和处理过的数组)

前缀和处理代码

for (int i = 1; i <= n; i ++ ){
	cin >> a[i];
	s[i] = s[i - 1] + a[i];
}

输入描述

第一行一个整数t,代表有t组输入(1t10 1 \leq t \leq 10

对于每一组数据,第一行一个整数n,代表一排中有n个数字(1n2105 1 \leq n \leq 2·10^5

第二行输入一串有n个字符的字符串,字符串由'0'和'1'构成,如果第i个字符是'1',则代表第i个数字是被选中的高亮状态,如果第i个字符是'0',则代表第i个数字未被选中(第i个数字指藏有密码信息的那一串数字的第i个)

第三行有一串数字a1,a2,a3,...,an,代表藏有密码信息的一排数字(1ai104 1 \leq ai \leq 10^4

输出描述

对于每一组数据,输出一个密码

Samples

4
5
01110
10 5 8 9 6
6
011011
20 10 9 30 20 19
4
0000
100 100 100 100
4
0111
5 4 5 1

27
80
0
14

样例解释

第一组数据

5
01110
10 5 8 9 6

可以将第一个1往前移动一个这样高亮数字就变成了 10110,这时候计算所有高亮数字和则为10+8+9=27

第二组数据

5
011011
20 10 9 30 20 19

将前两个1都往前移动一格,再将后两个1都往前移动一格,这样高亮数字就变成了110110,这时候对所有高亮数字求和则为20+10+30+20=80

Limitation

2s, 20 megabytes for each test case.