http://codeforces.com/contest/632/problem/B
翻转一个前缀或后缀,要求得到的B的sum最大
如果翻转前缀
预处理好ll[i] //左边翻前缀1-i
rr[i]//右边i+1到n不翻
同理,也预处理后缀的。
跑两遍dp即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
__int64 tm[5*100000+50];
char ss[5*100000+50];
__int64 ll[5*100000+50]; //fan
__int64 rr[5*100000+50]; //bufan
int main()
{
__int64 n;
scanf("%I64d",&n);
__int64 i;
for (i=1;i<=n;i++)
{
scanf("%I64d",&tm[i]);
}
scanf("%s",ss+1);
for (i=1;i<=n;i++) //fan
{
if (ss[i]=='A')
ll[i]=ll[i-1]+tm[i];
else
ll[i]=ll[i-1];
}
for (i=n;i>=1;i--) //bufan
{
if (ss[i]=='B')
rr[i]=rr[i+1]+tm[i];
else
rr[i]=rr[i+1];
}
__int64 maxx=0;
for (i=0;i<=n;i++)
{
if (ll[i]+rr[i+1]>maxx)
maxx=ll[i]+rr[i+1];
}
for (i=1;i<=n;i++) //bufan
{
if (ss[i]=='B')
ll[i]=ll[i-1]+tm[i];
else
ll[i]=ll[i-1];
}
for (i=n;i>=1;i--) //fan
{
if (ss[i]=='A')
rr[i]=rr[i+1]+tm[i];
else
rr[i]=rr[i+1];
}
for (i=0;i<=n;i++)
{
if (ll[i]+rr[i+1]>maxx)
maxx=ll[i]+rr[i+1];
}
printf("%I64d\n",maxx);
return 0;
}