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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<bits/stdc++.h>

#define llong long long
#define ldouble long double
#define uint unsigned int
#define ulong unsigned long long

using namespace std;

inline int get_segment(int l, int r, vector<int>& v) { // [l, r]
    if (l > r) return 0;
    return v[r] - v[l - 1];
}

inline int get_stracone(int l, int r, vector<int>& biuro, vector<int>& zdalne, vector<int>& bajlando, int t) {
    int n = biuro.size() - 1;
    int num_stracone = 0;
    num_stracone += get_segment(1, l - 1 - t, biuro);
    num_stracone += get_segment(l - t, l - 1, zdalne) + get_segment(l - t, l - 1, biuro);
    num_stracone += get_segment(r + 1, r + t, zdalne) + get_segment(r + 1, r + t, biuro);
    num_stracone += get_segment(r + t + 1, n, biuro);
    return num_stracone;
}

inline int get_ans(int l, int r, vector<int>& biuro, vector<int>& zdalne, vector<int>& bajlando, int k, int t) {
    int n = biuro.size() - 1;
    int stracone = get_stracone(l, r, biuro, zdalne, bajlando, t);
    if (stracone > k) return -1;

    int podroz = get_segment(l - t, l - 1, zdalne) + get_segment(r + 1, r + t, zdalne) +
                get_segment(l - t, l - 1, biuro) + get_segment(r + 1, r + t, biuro);

    int opcjonalne = k - podroz;

    int l_spotkan_w_domu = get_segment(1, l - 1 - t, biuro) + get_segment(1, l - 1 - t, zdalne) +
                    get_segment(r + t + 1, n, biuro) + get_segment(r + t + 1, n, zdalne);
    
    return get_segment(1, l - 1 - t, bajlando) + get_segment(r + t + 1, n, bajlando) + min(opcjonalne, l_spotkan_w_domu);
}

void solve() {
    int n, k, t; cin >> n >> k >> t;
    string s; cin >> s;
    vector<int> biuro(n + 1, 0), zdalne(n + 1, 0), bajlando(n + 1, 0);

    for (int i = 0; i < n; i++) {
        biuro[i + 1] = biuro[i];
        zdalne[i + 1] = zdalne[i];
        bajlando[i + 1] = bajlando[i];
        if (s[i] == '1') biuro[i + 1]++;
        if (s[i] == '2') zdalne[i + 1]++;
        if (s[i] == '3') bajlando[i + 1]++;
    }

    int ans = -1;
    for (int i = t + 1; i <= n - t; i++) {
        for (int j = i; j <= n - t; j++) {
            ans = max(ans, get_ans(i, j, biuro, zdalne, bajlando, k, t));
        }
    }

    int stracone = get_segment(1, n, biuro);
    if (stracone <= k) {
        int l_spotkan_w_domu = get_segment(1, n, biuro) + get_segment(1, n, zdalne);
        ans = max(ans, get_segment(1, n, bajlando) + min(k, l_spotkan_w_domu));
    }

    cout << ans << "\n";
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    solve();

    return 0;
}