左右不分(Right Left Wrong)


Submit solution

Points: 200
Time limit: 1.0s
Memory limit: 8M

Author:
Problem type
Allowed languages
C, C++

https://codeforces.com/problemset/problem/2000/D

左右不分(Right Left Wrong)

题目描述

Vlad 找到了一条长度为 \(n\) 的格子带,从左到右编号为 \(1\) 到 \(n\)。

第 \(i\) 个格子中有一个正整数 a[i] 和一个字符 s[i],其中 s[i] 仅为 'L' 或 'R'。

Vlad 希望你通过执行任意次数(包括 0 次)的操作来获得最多的积分。

操作定义

在一次操作中,你可以选择两个下标 l 和 r(满足 1 <= l < r <= n),并且:

s[l] == 'L' 且 s[r] == 'R'

然后你可以:

将 a[l] + a[l+1] + ... + a[r] 加入当前得分;

将下标从 l 到 r 的所有 s[i] 替换为 '.',表示这些格子不能再被使用。


示例说明

a: 3 5 1 4 3 2
s: L R L L L R

3 5 1 4 3 3
L R L L L R

你可以:

选择 l = 1, r = 2,得分增加 3 + 5 = 8,s 变成 . . L L L R

3 5 1 4 3 3
. . L L L R

然后选择 l = 3, r = 6,得分增加 1 + 4 + 3 + 2 = 10,s 变成 . . . . . .

3 5 1 4 3 3
. . . . . .

最终总分为 18,没有更多可行的操作。


输入格式

第一行一个整数 t(1 <= t <= 10000),表示测试用例的数量。

每个测试用例包含三行:

一个整数 n(2 <= n <= 200000)——格子数量;

n 个正整数 a[1], a[2], ..., a[n](1 <= a[i] <= 100000);

一个由 n 个字符组成的字符串 s,每个字符为 'L' 或 'R'。

保证所有测试用例中,n 的总和不超过 200000。


输出格式

每个测试用例输出一行一个整数,表示可以获得的最大得分。


示例输入
4
6
3 5 1 4 3 2
LRLLLR
2
2 8
LR
2
3 9
RL
5
1 2 3 4 5
LRLRR
示例输出
18
10
0
22
注意事项

测试用例的最后一个case的输出是22,而不是15,请仔细思考。

使用完之后的l,r设置成 . 代表这个区间使用过了,是指遍历 字符串的时候,这个区间的字符串已经使用了,不能再次使用这个字符串的字符了,

不是指相应位置上的数字使用过了不能再次使用。


Comments

There are no comments at the moment.