题意
给定数组
p[i]
,每个
i
标记一个 ‘A’ 或者’B’,因此也就有一个对应的字符数组,通过对这个字符数组的任意一个前缀子串或者后缀子串进行反转,即A
题解
枚举每一个前缀子串,后缀子串,当然,这样直接枚举复杂度很高,利用前缀、后缀具有的性质,可以省去很多重复的计算。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500000 + 10;
int p[maxn];
int main()
{
#ifdef LOCAL
fstream cin("b.in");
#endif // LOCAL
int n;
ios::sync_with_stdio(false);
while(cin >> n)
{
string str;
long long ans = 0;
for(int i = 0; i < n; ++i) cin >> p[i];
cin >> str;
for(int i = 0; i < n; ++i)
{
if(str[i] == 'B') ans += p[i];
}
long long anstmp = ans;
long long tmp = ans;
for(int i = 0; i < n; ++i)
{
if(str[i] == 'A') tmp += p[i];
else tmp -= p[i];
ans = max(ans, tmp);
}
tmp = anstmp;
for(int i = n - 1; i >= 0; --i)
{
if(str[i] == 'A') tmp += p[i];
else tmp -= p[i];
ans = max(tmp, ans);
}
cout << ans << endl;
}
return 0;
}