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";
}