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
79
80
81
82
83
84
85
86
87
88
89
90
#include <bits/stdc++.h>

int n, k, t;
std::string s;

int onsite_meetings_prefix_sum[10005];
int remote_meetings_prefix_sum[10005];
int no_meetings_prefix_sum[10005];
int all_meetings_number;

void load_data();
void make_prefix_arrays();
void bruteforce();
void remote_day();
void print_result();

int result = -1;

int main() {
    load_data();
    make_prefix_arrays();
    bruteforce();
    remote_day();
    print_result();
    return 0;
}

void load_data() {
    std::cin >> n >> k >> t;
    std::cin >> s;
}

void make_prefix_arrays() {
    for (int i = 1; i <= n; i++) {
        onsite_meetings_prefix_sum[i] = onsite_meetings_prefix_sum[i - 1] + (s[i - 1] == '1');
        remote_meetings_prefix_sum[i] = remote_meetings_prefix_sum[i - 1] + (s[i - 1] == '2');
        no_meetings_prefix_sum[i] = no_meetings_prefix_sum[i - 1] + (s[i - 1] == '3');
    }
    all_meetings_number = onsite_meetings_prefix_sum[n] + remote_meetings_prefix_sum[n];
}

void bruteforce() {
    for (int i = 0; i <= n - 2 * t; ++i) {
        for (int j = i + 2 * t; j <= n; ++j) {
            int home_free = no_meetings_prefix_sum[i] +
                            (no_meetings_prefix_sum[n] - no_meetings_prefix_sum[j]);
            int home_remote = remote_meetings_prefix_sum[i] +
                              (remote_meetings_prefix_sum[n] - remote_meetings_prefix_sum[j]);
            int home_office = onsite_meetings_prefix_sum[i] +
                              (onsite_meetings_prefix_sum[n] - onsite_meetings_prefix_sum[j]);
            
            int transit1 = (onsite_meetings_prefix_sum[i + t] - onsite_meetings_prefix_sum[i]) +
                           (remote_meetings_prefix_sum[i + t] - remote_meetings_prefix_sum[i]);
            int transit2 = (onsite_meetings_prefix_sum[j] - onsite_meetings_prefix_sum[j - t]) +
                           (remote_meetings_prefix_sum[j] - remote_meetings_prefix_sum[j - t]);
            int transit_missed = transit1 + transit2;
            
            int base_missed = transit_missed + home_office;
            int available = k - base_missed;

            if (available < 0)
                continue;

            int skipped_remote = std::min(home_remote, available);
            int tasks = home_free + skipped_remote + home_office;
            
            result = std::max(result, tasks);
        }
    }
}

void remote_day() {
    int home_office = onsite_meetings_prefix_sum[n];
    if (home_office > k)
        return;

    int home_free = no_meetings_prefix_sum[n] + home_office;
    int home_remote = remote_meetings_prefix_sum[n];

    int available = k - home_office;
    int skipped_remote = std::min(home_remote, available);

    int tasks = home_free + skipped_remote;
    result = std::max(result, tasks);
}


void print_result() {
    std::cout << result << std::endl;
}