#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
#define st first
#define nd second
typedef pair<int,int> pun;
typedef long long ll;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, k, t;
cin >> n >> k >> t;
string s, sin;
cin >> sin;
s = "$" + sin;
int score = -1;
vector<vector<int>> pre, suf;
pre.resize(3);
suf.resize(3);
for (int i = 0; i < 3; i ++) {
pre[i].resize(n+2, 0);
suf[i].resize(n+2, 0);
}
for (int i = 1; i <= n; i ++) {
for (int j = 0; j < 3; j ++) pre[j][i] = pre[j][i-1];
pre[s[i] -'1'][i] ++;
}
for (int i = n; i > 0; i --) {
for (int j = 0; j < 3; j ++) suf[j][i] = suf[j][i+1];
suf[s[i] -'1'][i] ++;
}
for (int i = 0; i <= n; i ++) {
for (int j = i + t; j + t <= n+1; j ++) {
int missed = pre[0][i+t] + suf[0][j] + (pre[1][i+t] - pre[1][i]) + (suf[1][j] - suf[1][j+t]);
int gained = pre[0][i] + suf[0][j+t] + pre[2][i] + suf[2][j+t];
// cerr << i << " " << j << " " << missed << " " << gained << "\n";
if (missed <= k) score = max(score, gained);
}
}
if (pre[0][n] <= k) score = max(score, n - max(0, pre[1][n] + pre[0][n] - k));
cout << score;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; #define st first #define nd second typedef pair<int,int> pun; typedef long long ll; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, k, t; cin >> n >> k >> t; string s, sin; cin >> sin; s = "$" + sin; int score = -1; vector<vector<int>> pre, suf; pre.resize(3); suf.resize(3); for (int i = 0; i < 3; i ++) { pre[i].resize(n+2, 0); suf[i].resize(n+2, 0); } for (int i = 1; i <= n; i ++) { for (int j = 0; j < 3; j ++) pre[j][i] = pre[j][i-1]; pre[s[i] -'1'][i] ++; } for (int i = n; i > 0; i --) { for (int j = 0; j < 3; j ++) suf[j][i] = suf[j][i+1]; suf[s[i] -'1'][i] ++; } for (int i = 0; i <= n; i ++) { for (int j = i + t; j + t <= n+1; j ++) { int missed = pre[0][i+t] + suf[0][j] + (pre[1][i+t] - pre[1][i]) + (suf[1][j] - suf[1][j+t]); int gained = pre[0][i] + suf[0][j+t] + pre[2][i] + suf[2][j+t]; // cerr << i << " " << j << " " << missed << " " << gained << "\n"; if (missed <= k) score = max(score, gained); } } if (pre[0][n] <= k) score = max(score, n - max(0, pre[1][n] + pre[0][n] - k)); cout << score; } |
English