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

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

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

(Е. Джобс) Текстовый файл 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

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

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

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

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