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

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

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

(П. Финкель) Текстовый файл 24-278.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и десятичные цифры. Определите максимальную длину последовательности из букв {K, N, L, F} в любом порядке, которая ограничена по краям одинаковыми чётными цифрами.

Решение

Наиболее короткое решение на Python заключается в разделении исходной строки по каждой четной цифре, выделении из получившихся подстрок тех, которые содержат только указанные символы, получение длины каждой строки и выбор из этих значений максимального.

Python короткое решение

s = open('24-278.txt').readline()
mx = 0
for i in '02468':
    mx = max(mx, *[len(x) for x in s.split(i) if len(set(x) - set('KNLF')) == 0])
print(mx)

Решение можно еще больше сократить и написать в одну строку, если использовать сложное списочное выражение.

Python короткое решение в одну строку

print(max([len(s) for i in '02468' for s in open('24-278.txt').readline().split(i) if len(set(s) - set('KNLF')) == 0]))

Универсальное решение, которое можно реализовать на любом языке программирования заключается в посимвольном просмотре строки. В цикле подсчитываем длину непрерывной цепочки из указанных символов. Встретив четную цифру, сравниваем ее с предыдущей встреченной четной цифрой перед непрерывной цепочкой. Если они совпадают, сравниваем длину получившейся цепочки с максимальной.

Python универсальное решение

s = open('24-278.txt').readline()
k = 0
mx = 0
last = ''
for i in s:
    if i in '02468':
        if  i == last:
            mx = max(mx, k)
        k = 0;
        last = i
    elif i in 'KNLF':
        k+= 1
    else:
        k = 0
        last = ''
print(mx)

PascalABC универсальное решение

var
    k, max, i: Integer;
    s: String;
    last: Char;
    f: TEXT;
begin
    Assign(f, '24-278.txt');
    Reset(f);
    Readln(f, s);
    k := 0;
    max := 0;
    last := ' ';
    for i := 1 to s.Length do
    begin
        if '02468'.IndexOf(s[i]) <> -1 then
        begin
            if (s[i] = last) and (k > max) then
                max := k;
            k := 0;
            last := s[i];
        end
        else if 'KNLF'.IndexOf(s[i]) <> -1 then
            k := k + 1
        else
        begin
            k := 0;
            last := ' ';
        end;
    end;
    Writeln(max);
end.

C++ универсальное решение

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-278.txt");
    string s;
    f >> s;
    int k = 0, max = 0;
    string s1 = "02468", s2 = "KNLF";
    char last = ' ';
    for (int i = 0; i < s.length(); i++)
    {
        if (s1.find(s[i]) != -1)
        {
            if (s[i] == last && k > max)
                max = k;
            k = 0;
            last = s[i];
        }
        else if (s2.find(s[i]) != -1)
            k++;
        else
        {
            k = 0;
            last = ' ';
        }
    }
    cout << max << endl;
}

Ответ

5103

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

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

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

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