CF 660C
- 双倍经验:676C , 加了一个输出方案, 记录是一下是哪个区间就好了。
- 大水题,双端队列搞一发。
- 题意:对一个只有ab的串修改k个字符,使得其连续的字母个数最多。
- 思路:记录每个字母个数的前缀和,求前缀和差值小于等于k的最远的一对就好。
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>const int maxn = 300007;int str[maxn];int pre[maxn], n, k, s, t;int cal(){ int l = 1, ret = 0; for(int r = 1; r <= n; r ++){ while(l <= n && pre[r] - pre[l - 1] > k) l++; if(r - l + 1 > ret){ ret = r - l + 1; s = l, t = r; } } return ret;}int main(){ std::cin >> n >> k; int ans = k; int count = 0; for(int i = 1; i <= n; i ++){ std::cin >> str[i]; } for(int i = 1; i <= n; i ++){ if(str[i] == 0) count ++; pre[i] = count; } std::cout << cal() << std::endl; for(int i = 1; i <= n; i ++){ if(i == s) for(int j = s; j <= t; j ++){ if(j != 1) std::cout << ' '; std::cout << 1; if(j == t) i = t + 1; } if(i > n) break; if(i != 1) std::cout << ' '; std::cout << str[i]; } std::cout << "\n";}