zoukankan      html  css  js  c++  java
  • Codeforces Round #354 (Div. 2) C. Vasya and String

    题目链接:

    http://codeforces.com/contest/676/problem/C

    题解:

    把连续的一段压缩成一个数,对新的数组求前缀和,用两个指针从左到右线性扫一遍。

    一段值改变一部分的情况考虑的不够周到,wa了两次。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    using namespace std;
    
    const int maxn = 100000 + 10;
    char str[maxn];
    int arr[maxn], tot;
    int sum[maxn];
    
    int n, k;
    
    int solve(int fst) {
        int ret = -1, cnt = 0;
        int p1 = fst;
        for (int p2 = fst; p2 <= tot; p2 += 2) {
            cnt += arr[p2];
            while (p1 <= p2&&cnt > k) {
                cnt -= arr[p1]; p1 += 2;
            }
            if (p1 <= p2) {
                if (p1 - 2 >= 0 && p2 + 1 <= n) {
                    ret = max(ret, sum[p2 + 1] - sum[p1 - 2]+k-cnt);
                    ret = min(ret, n);
                }
                else if (p1 - 2 >= 0) {
                    ret = max(ret, sum[p2] - sum[p1 - 2] + k - cnt);
                    ret = min(ret, n);
                }
                else if (p2 + 1 <= n) {
                    ret = max(ret, sum[p2 + 1] - sum[p1 - 1] + k - cnt);
                    ret = min(ret, n);
                }
                else {
                    ret = max(ret, sum[p2] - sum[p1 - 1] + k - cnt);
                    ret = min(ret, n);
                }
            }
        }
        return ret;
    }
    
    int main() {
        while (scanf("%d%d", &n, &k) == 2 && n) {
            scanf("%s", str);
            tot = 0;
            int cnt = 1;
            for (int i = 0; i < n - 1; i++) {
                if (str[i] != str[i + 1]) {
                    arr[++tot] = cnt;
                    cnt = 1;
                }
                else {
                    cnt++;
                }
            }
            arr[++tot] = cnt;
            sum[0] = 0;
            for (int i = 1; i <= tot; i++) sum[i] = sum[i - 1] + arr[i];
            int ans = 0;
            for (int i = 1; i <= tot; i++) {
                ans = max(ans, arr[i] + k);
                ans = min(ans, n);
            }
            ans = max(ans, solve(1));
            ans = max(ans, solve(2));
            printf("%d
    ", ans);
        }
        return 0;
    }
    
    /*
    4 2
    abba
    8 1
    aabaabaa
    5 2
    ababa
    5 1
    ababa
    4 1
    aaba
    5 0
    aaaaa
    */
  • 相关阅读:
    python中如何将两个list合并成一个list,不用for语句
    python print的用法
    Pandas Timestamp 和 python 中 datetime 的互相转换
    python eval, exec. compile
    python 用 __all__ 暴露接口
    python functiontools 模块
    Python 修饰符, 装饰符
    Python 字典(Dictionary) update()方法
    Python :random 随机数生成
    Pandas dataframe 标记删除重复记录
  • 原文地址:https://www.cnblogs.com/fenice/p/5531359.html
Copyright © 2011-2022 走看看