[2016-03-26][codeforces][632][B][Alice, Bob, Two Teams]

  • 时间: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字符数的前缀和,枚举翻转的长度,更新最大值

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. typedef long long LL;
  5. const int maxn = 5 * 1E5 + 10;
  6. LL a[maxn],b[maxn];
  7. char str[maxn];
  8. int main(){
  9. int n;
  10. scanf("%d",&n);
  11. for(int i = 1;i <= n ;++i){
  12. scanf("%I64d",&a[i]);
  13. }
  14. getchar();
  15. gets(str+1);
  16. for(int i = 1 ;i <= n ;++i){
  17. if(str[i] == 'B'){
  18. b[i] = b[i - 1] + a[i];
  19. }else b[i] = b[i - 1];
  20. a[i] += a[i - 1];
  21. }
  22. LL ans = 0;
  23. for(int i = 0;i <= n ;++i){
  24. ans = max(ans, a[i] - b[i] + (b[n] - b[i]));
  25. ans = max(ans,(a[n] - a[i]) - (b[n] - b[i]) + b[i]);
  26. }
  27. printf("%I64d\n",ans);
  28. return 0;
  29. }


来自为知笔记(Wiz)


posted on 2016-03-26 11:17  红洋  阅读(98)  评论(0)    收藏  举报

导航