Задача 6651. Источник: Поляков. Задание КИМ 24
(Е. Джобс) Текстовый файл 24-263.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита. Определите минимальную длину подстроки, в которой ровно три тройки BAD или FAT. Например, в строке SDFATFDBADZZSFATBADGHTBAD есть три подходящие подстроки FATFDBADZZSFAT, BADZZSFATBAD и FATBADGHTBAD. Минимальная длина 12.
Решение
Заменим все тройки BAD и FAT на символ *. Полученную строку будем обрабатывать посимвольно. В переменной last1 будем хранить позицию последнего символа *, а в переменной last2 - предпоследнего. Встретив третий символ *, находим длину подстроки от last2 до текущей позиции, добавив к количеству символы, которые были удалены при замене.
Python
s = open('24-263.txt').readline()
mn = len(s)
s = s.replace("BAD", "*").replace("FAT", "*")
last1 = -1
last2 = -1
for i in range(len(s)):
if s[i] == '*':
if last2 != -1:
mn = min(mn, i - last2 + 7)
last2 = last1
last1 = i
print(mn)
PascalABC
var
i, min, last1, last2: Integer;
s: String;
f: TEXT;
begin
Assign(f, '24-263.txt');
Reset(f);
Readln(f, s);
min := s.Length;
s := s.replace('BAD', '*').replace('FAT', '*');
last1 := 0;
last2 := 0;
for i := 1 to s.Length do
if s[i] = '*' then
begin
if (last2 <> 0) and (i - last2 + 7 < min) then
min := i - last2 + 7;
last2 := last1;
last1 := 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();
size_t start = s.find("BAD");
while (start != string::npos)
{
s.replace(start, 3, "*");
start = s.find("BAD", start + 1);
}
start = s.find("FAT");
while (start != string::npos)
{
s.replace(start, 3, "*");
start = s.find("FAT", start + 1);
}
int last1 = -1, last2 = -1;
for (int i = 0; i < s.length(); i++)
if (s[i] == '*')
{
if (last2 != -1 && i - last2 + 7 < min)
min = i - last2 + 7;
last2 = last1;
last1 = i;
}
cout << min << endl;
}
Ответ
10