Задача 6674. Источник: Поляков. Задание КИМ 24
(ЕГЭ-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