Программное решение задач ЕГЭ по информатике

Задача 6674. Источник: Поляков. Задание КИМ 24

Страница задачи 6674

(ЕГЭ-2023) Текстовый файл 24-263.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита. Определите минимальную длину подстроки, в которой символ Z встречается не менее 120 раз.

Решение

Создадим массив/список из 119 элементов, где будут хранится позиции последних 119 символов Z. После заполнения массива, встретив 120 символ Z, подсчитываем длину строки от первого символа Z и сравниваем ее с текущей минимальной.

Python

s = open('24-263.txt').readline()
mn = len(s)
last = [-1] * 119
for i in range(len(s)):
    if s[i] == 'Z':
        if last[0] != -1:
            mn = min(mn, i - last[0] + 1)
        del last[0]
        last.append(i)
print(mn)

PascalABC с использованием статического массива

var
    i, j, min: Integer;
    s: String;
    last: Array [1..119] of Integer;
    f: TEXT;
begin
    Assign(f, '24-263.txt');
    Reset(f);
    Readln(f, s);
    min := s.Length;
    for i := 1 to 119 do
        last[i] := 0;
    for i := 1 to s.Length do
        if s[i] = 'Z' then
        begin
            if (last[1] <> 0) and (i - last[1] + 1 < min) then
                min := i - last[1] + 1;
            for j := 1 to 118 do
                last[j] := last[j + 1];
            last[119] := i;
        end;
    Writeln(min);
end.

PascalABC с использованием динамического массива

var
    i, min: Integer;
    s: String;
    last: Array of Integer := ArrFill(119, 0);
    f: TEXT;
begin
    Assign(f, '24-263.txt');
    Reset(f);
    Readln(f, s);
    min := s.Length;
    for i := 1 to s.Length do
        if s[i] = 'Z' then
        begin
            if (last[0] <> 0) and (i - last[0] + 1 < min) then
                min := i - last[0] + 1;
            last := last[1:] + Arr(i);
        end;
    Writeln(min);
end.

C++ с использованием статического массива

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-263.txt");
    string s;
    f >> s;
    int min = s.length();
    int last[119];
    for (int i = 0; i < 119; i++)
        last[i] = -1;
    for (int i = 0; i < s.length(); i++)
        if (s[i] == 'Z')
        {
            if (last[0] != -1 && i - last[0] + 1 < min)
                min = i - last[0] + 1;
            for (int i = 0; i < 118; i++)
                last[i] = last[i + 1];
            last[118] = i;
        }
    cout << min << endl;
}

C++ с использованием vector

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-263.txt");
    string s;
    f >> s;
    int min = s.length();
    vector<int> last;
    for (int i = 0; i < 119; i++)
        last.push_back(-1);
    for (int i = 0; i < s.length(); i++)
        if (s[i] == 'Z')
        {
            if (last[0] != -1 && i - last[0] + 1 < min)
                min = i - last[0] + 1;
            last.erase(last.begin());
            last.push_back(i);
        }
    cout << min << endl;
}

Ответ

2310

Отправить замечание по решению

Код по которому имеется замечание:

Ваш вариант кода:

Комментарий: