from sys import stdin, stdout def count_periods(start, end, activity_type): return activity_counter[activity_type][end] - activity_counter[activity_type][start] def get_case_value(dojazd, powrot): """ dojazd - first time period when riding to the office powrot - first time period when riding home counting from 0 """ zdalne_zgubione = count_periods(dojazd, dojazd + t, 2) + count_periods(powrot, powrot + t, 2) biurowe_zgubione = count_periods(0, dojazd + t, 1) + count_periods(powrot, n, 1) zgubione = zdalne_zgubione + biurowe_zgubione if zgubione > k: return -1 zdalne_domowe = count_periods(0, dojazd, 2) + count_periods(powrot + t, n, 2) czas_domowy = dojazd + n - powrot - t do_odbycia_dom = max(0, zdalne_domowe + zgubione - k) return czas_domowy - do_odbycia_dom def get_no_office(): """ jaki wynik, jeśli w ogóle nie jedzie do biura """ zgubione = count_periods(0, n, 1) if zgubione > k: return -1 zdalne_domowe = count_periods(0, n, 2) do_odbycia_dom = max(0, zdalne_domowe + zgubione - k) return n - do_odbycia_dom def brute_force(): output = get_no_office() for dojazd in range(0, n - 2*t): for powrot in range(dojazd + t + 1, n - t + 1): output = max(output, get_case_value(dojazd, powrot)) return output def solve(): zysk_start = [-1] * (k + 1) max_nieznany = k dojazd = n - 2*t - 1 while dojazd >= 0: koszt = count_periods(0, dojazd + t, 2) + count_periods(0, dojazd + t, 1) zysk = dojazd zdalne_domowe = count_periods(0, dojazd, 2) min_koszt = koszt - zdalne_domowe i = min(max_nieznany, koszt) # print(dojazd, koszt, zysk, min_koszt) while i >= min_koszt: zysk_start[i] = zysk - koszt + i i -= 1 # print(zysk_start) max_nieznany = min(min_koszt - 1, max_nieznany) dojazd -= 1 zysk_koniec = [-1] * (k + 1) max_nieznany = k powrot = t + 1 while powrot <= n - t: koszt = count_periods(powrot, n, 2) + count_periods(powrot, n, 1) zysk = n - powrot - t zdalne_domowe = count_periods(powrot + t, n, 2) min_koszt = koszt - zdalne_domowe i = min(max_nieznany, koszt) while i >= min_koszt: zysk_koniec[i] = zysk - koszt + i i -= 1 max_nieznany = min(min_koszt - 1, max_nieznany) powrot += 1 output = get_no_office() for i in range(0, k+1): zs = zysk_start[i] zk = zysk_koniec[k-i] if (zs >= 0) and (zk >= 0): output = max(output, zs + zk) # print(zysk_start) # print(zysk_koniec) return output n, k, t = [int(s) for s in stdin.readline().split()] activities_str = stdin.readline().strip() activity_counter = {i: [0] for i in range(1, 4)} for s in activities_str: for i in range(1, 4): activity_counter[i].append(activity_counter[i][-1]) activity_counter[int(s)][-1] += 1 output = solve() stdout.write(str(output))
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 91 92 93 94 95 96 97 98 99 100 | from sys import stdin, stdout def count_periods(start, end, activity_type): return activity_counter[activity_type][end] - activity_counter[activity_type][start] def get_case_value(dojazd, powrot): """ dojazd - first time period when riding to the office powrot - first time period when riding home counting from 0 """ zdalne_zgubione = count_periods(dojazd, dojazd + t, 2) + count_periods(powrot, powrot + t, 2) biurowe_zgubione = count_periods(0, dojazd + t, 1) + count_periods(powrot, n, 1) zgubione = zdalne_zgubione + biurowe_zgubione if zgubione > k: return -1 zdalne_domowe = count_periods(0, dojazd, 2) + count_periods(powrot + t, n, 2) czas_domowy = dojazd + n - powrot - t do_odbycia_dom = max(0, zdalne_domowe + zgubione - k) return czas_domowy - do_odbycia_dom def get_no_office(): """ jaki wynik, jeśli w ogóle nie jedzie do biura """ zgubione = count_periods(0, n, 1) if zgubione > k: return -1 zdalne_domowe = count_periods(0, n, 2) do_odbycia_dom = max(0, zdalne_domowe + zgubione - k) return n - do_odbycia_dom def brute_force(): output = get_no_office() for dojazd in range(0, n - 2*t): for powrot in range(dojazd + t + 1, n - t + 1): output = max(output, get_case_value(dojazd, powrot)) return output def solve(): zysk_start = [-1] * (k + 1) max_nieznany = k dojazd = n - 2*t - 1 while dojazd >= 0: koszt = count_periods(0, dojazd + t, 2) + count_periods(0, dojazd + t, 1) zysk = dojazd zdalne_domowe = count_periods(0, dojazd, 2) min_koszt = koszt - zdalne_domowe i = min(max_nieznany, koszt) # print(dojazd, koszt, zysk, min_koszt) while i >= min_koszt: zysk_start[i] = zysk - koszt + i i -= 1 # print(zysk_start) max_nieznany = min(min_koszt - 1, max_nieznany) dojazd -= 1 zysk_koniec = [-1] * (k + 1) max_nieznany = k powrot = t + 1 while powrot <= n - t: koszt = count_periods(powrot, n, 2) + count_periods(powrot, n, 1) zysk = n - powrot - t zdalne_domowe = count_periods(powrot + t, n, 2) min_koszt = koszt - zdalne_domowe i = min(max_nieznany, koszt) while i >= min_koszt: zysk_koniec[i] = zysk - koszt + i i -= 1 max_nieznany = min(min_koszt - 1, max_nieznany) powrot += 1 output = get_no_office() for i in range(0, k+1): zs = zysk_start[i] zk = zysk_koniec[k-i] if (zs >= 0) and (zk >= 0): output = max(output, zs + zk) # print(zysk_start) # print(zysk_koniec) return output n, k, t = [int(s) for s in stdin.readline().split()] activities_str = stdin.readline().strip() activity_counter = {i: [0] for i in range(1, 4)} for s in activities_str: for i in range(1, 4): activity_counter[i].append(activity_counter[i][-1]) activity_counter[int(s)][-1] += 1 output = solve() stdout.write(str(output)) |