【题意】
输入n,代表有n个数,然后再输入n个力量,在输入长度为n的字符串(字符串只包括A或
B),Bob 能够选择该字符串的某一前缀或者后缀,或者什么也不做,将其反转(如果是
A,则变成B,如果是B 则变成A),最后Bob的力量是所有B对应的力量和。输出最大的力
量和!
【解题思路】
因为是前缀或者后缀,所以直接扫描终点即可!然后区间内的把A的力量加起来,区间外的
把B的力量加起来,比较最大值即可!
【AC代码】
#include <bits/stdc++.h>
using namespace std;
#define CLE(a,b) memset(a,b,sizeof(a))
#define MEC(a,b) memcpy(a,b,sizeof(a))
#define ll long long
using namespace std;
const int nn = 500010;
int a[nn];
char s[nn];
ll sum1[nn],sum2[nn];
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i];
scanf("%s",s+1);
CLE(sum1,0);
CLE(sum2,0);
for(int i=1; i<=n; i++)
{
sum1[i] = 0,sum2[i] = 0;
sum1[i] += sum1[i-1],sum2[i] += sum2[i-1];
if(s[i]=='A')sum1[i] += a[i];
else sum2[i] += a[i];
}
ll ans = -1;
ll len = n;
ll tsum = 0;
for(int i=1; i<=n; i++)//change prefix.
{
tsum = sum1[i] + sum2[len] - sum2[i];
ans = max(ans,tsum);
}
for(int i=len; i>0; i--)//change suffix.
{
tsum = sum2[i] + sum1[len] - sum1[i];
ans = max(ans,tsum);
}
cout<<ans<<endl;
return 0;
}