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
#include <bits/stdc++.h>

using namespace std;

int main() {
    int n,k,t; cin >> n >> k >> t;
    vector<int> tab(n+1);
    string s; cin >> s;
    for(int i = 0; i < s.size(); i++) tab[i+1] = s[i] - '0';
    vector<vector<int>> suma(n+1, vector<int>(4));
    for(int i = 1; i <= n; i++) {
        suma[i][1] = suma[i-1][1];
        suma[i][2] = suma[i-1][2];
        suma[i][3] = suma[i-1][3];
        if(tab[i] == 1) suma[i][1]++;
        if(tab[i] == 2) suma[i][2]++;
        if(tab[i] == 3) suma[i][3]++;
    }
    int ans = -1;
    for(int i = 1; i <= n; i++) {
        for(int j = i + 2*t-1; j <= n; j++) {
            int opuszczone = 0;
            opuszczone += suma[j][1] - suma[j - t][1];
            opuszczone += suma[j][2] - suma[j - t][2];
            opuszczone += suma[i+t-1][1] - suma[i-1][1];
            opuszczone += suma[i+t-1][2] - suma[i-1][2];
            int opuszczone2 = 0;
            opuszczone2 += suma[i-1][1];
            opuszczone2 += suma[n][1] - suma[j][1];
            int tmpans = n - (j - i + 1);
            //tmpans += suma[i-1][3] + suma[n][3] - suma[j][3];
            int zdalne = suma[i-1][2] + suma[n][2] - suma[j][2];
            //if(opuszczone + opuszczone2 <= k) ans = max(ans,tmpans + min(k - (opuszczone + opuszczone2),opuszczone2));
            //
            tmpans -= max(0, zdalne - (k - (opuszczone + opuszczone2)));
            bool czy = opuszczone + opuszczone2 <= k;
            //cout << i << " " << j << " " << czy << " " << tmpans << " " << opuszczone << " " << opuszczone2 << endl;
            if(czy) ans = max(ans,tmpans);
        }
    }
    if(suma[n][1] <= k) ans = suma[n][3] + min(k,suma[n][1]+suma[n][2]);
    cout << ans;
    return 0;
}