题目门


【题意】

输入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;
}