1. 程式人生 > >【CodeForces - 632B】【Alice, Bob, Two Teams】(字首和求最優差值)

【CodeForces - 632B】【Alice, Bob, Two Teams】(字首和求最優差值)

題目:

Alice and Bob are playing a game. The game involves splitting up game pieces into two teams. There are n pieces, and the i-th piece has a strength pi.

The way to split up game pieces is split into several steps:

  1. First, Alice will split the pieces into two different groups A
     and B. This can be seen as writing the assignment of teams of a piece in an n character string, where each character is A or B.
  2. Bob will then choose an arbitrary prefix or suffix of the string, and flip each character in that suffix (i.e. change A to B
     and B to A). He can do this step at most once.
  3. Alice will get all the pieces marked A and Bob will get all the pieces marked B.

The strength of a player is then the sum of strengths of the pieces in the group.

Given Alice's initial split into two teams, help Bob determine an optimal strategy. Return the maximum strength he can achieve.

Input

The first line contains integer n (1 ≤ n ≤ 5·105) — the number of game pieces.

The second line contains n integers pi (1 ≤ pi ≤ 109) — the strength of the i-th piece.

The third line contains n characters A or B — the assignment of teams after the first step (after Alice's step).

Output

Print the only integer a — the maximum strength Bob can achieve.

Examples

Input

5
1 2 3 4 5
ABABA

Output

11

Input

5
1 2 3 4 5
AAAAA

Output

15

Input

1
1
B

Output

1

Note

In the first sample Bob should flip the suffix of length one.

In the second sample Bob should flip the prefix or the suffix (here it is the same) of length 5.

In the third sample Bob should do nothing.

解題報告:就是問給定字串AB組成的,每個位置代表一個數字,在有一次可以改變任意字首和字尾和的機會下(使其AB顛倒),怎麼能使B的求和最大。剛上來進入誤區了,就是想使B儘量往後跑,沒注意到這個不是升序的。

可以開闢a b兩個陣列,用來存放字首和(a是全部的字首和,b是僅僅b字元所對下標的字首和

),之後在迴圈下,將單點的字首更新和字尾更新取最大,即可。

ac程式碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;

const int maxn=5e5+1000;
ll num[maxn];
ll a[maxn],b[maxn];
int n;
char str[maxn];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&num[i]);
	cin>>str+1;
	a[0]=b[0]=0;
	for(int i=1;i<=n;i++)
	{
		if(str[i]=='B')
		{
			b[i]=b[i-1]+num[i];		
		}	
		else
			b[i]=b[i-1];
		a[i]=a[i-1]+num[i];
	}
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,(a[i]-b[i]+b[n]-b[i]));//字首和更新,將前i位反轉 
		ans=max(ans,(a[n]-a[i]-(b[n]-b[i])+b[i]));//字尾和更新。將後i-n位反轉 
	}
	printf("%lld\n",ans);
}