时间:2016-03-26 10:14:35 星期六
题目编号:[2016-03-26][codeforces][632][B][Alice, Bob, Two Teams]
题目大意:给定n段字符串,每段字符串要么都是A,要么都是B,已知每段字符串的长度和字符,问把前k段字符或者后k段字符翻转(A -> B,b -> A,k是任意的),问最多能得到多少个B
分析:先求前n段字符总字符数的前缀和,和B字符数的前缀和,枚举翻转的长度,更新最大值
#include <cstdio>#include <algorithm>using namespace std;typedef long long LL;const int maxn = 5 * 1E5 + 10;LL a[maxn],b[maxn];char str[maxn];int main(){ int n; scanf("%d",&n); for(int i = 1;i <= n ;++i){ scanf("%I64d",&a[i]); } getchar(); gets(str+1); for(int i = 1 ;i <= n ;++i){ if(str[i] == 'B'){ b[i] = b[i - 1] + a[i]; }else b[i] = b[i - 1]; a[i] += a[i - 1]; } LL ans = 0; for(int i = 0;i <= n ;++i){ ans = max(ans, a[i] - b[i] + (b[n] - b[i])); ans = max(ans,(a[n] - a[i]) - (b[n] - b[i]) + b[i]); } printf("%I64d\n",ans); return 0;}