题意::题目是说从前或从后选一个子串(必须包括首或者尾,长度任意),把A变B,B变A,然后计算B的总价值,使之最大。
题解:先统计不变时B的价值,然后从前从后各扫一遍就行了
sum1记录从前到后变化A B,值的变化。sum2记录从后到前变化......
如:从前到后扫一遍,i=3,那么sum1就继续改变(i=1,i=2 .A变成B,B变成A已经记录),再更新ans
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
int a[500010];
char s[500010];
int main()
{
int n;
while(~scanf("%d",&n))
{
__int64 ans=0,sum1,sum2;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%s",s+1);
for(int i=1;i<=n;i++)
{
if(s[i]=='B')
ans+=a[i];
}
sum1=ans;
sum2=ans;
for(int i=1;i<=n;i++) //从前到后一个for循环,两个for会超时.要包括首以及i之前的字母那么sum1就一直更新就好
{
if(s[i]=='A')
sum1+=a[i];
else
sum1-=a[i];
ans=max(ans,sum1);
}
for(int i=n;i>=1;i--)
{
if(s[i]=='A')
sum2+=a[i];
else
sum2-=a[i];
ans=max(ans,sum2);
}
printf("%I64d\n",ans);
}
return 0;
}