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

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

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

(Е. Джобс) Текстовый файл 24-261.txt состоит не более чем из 106 символов и содержит только буквы латинского алфавита. Определите максимальную длину подпоследовательности, которая состоит только из пар символов EA, только из троек символов NPC, или из пар символов EA и троек символов NPC. Например, в строке FASEAEANPCVESEAEAEADDNPC есть три подходящие подпоследовательности EAEANPC, EAEAEA и NPC. Максимальную длину 7 имеет первая из них. Ответ: 7.

Решение

Поскольку в данной задаче конец одной последовательности не может являться началом другой последовательности, самое компактное решение реализуется на использовании замен и разделения строки на подстроки. Заменим ЕА на **, NPC на ***, а затем заменим все буквы латинского алфавита на какую-то одну. После этого мы сможем разделить строку методом split и проанализировать длину каждой подстроки из символов *.

Python

s = open('24-261.txt').readline().replace('EA', '**').replace('NPC', '***')
for i in range(65, 90):
    s = s.replace(chr(i), 'Z')
print(max(map(len,s.split('Z'))))

PascalABC

var
    max, i: Integer;
    s: String;
    ss: Array of String;
    c: Char;
    f: TEXT;
begin
    Assign(f, '24-261.txt');
    Reset(f);
    Readln(f, s);
    max := 0;
    s := s.Replace('EA', '**').Replace('NPC', '***');
    for c := 'A' to 'Y' do
        s := s.Replace(c, 'Z');
    ss := s.Split('Z');
    for i := 0 to ss.Length - 1 do
        if ss[i].Length > max then
            max := ss[i].Length;
    Writeln(max);
end.

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

Python

s = open('24-261.txt').readline()
k = 0
mx = 0
i = 0;
while i < len(s) - 1:
    if s[i:i + 2] == 'EA':
        k += 2
        i += 2
    elif s[i:i + 3] == 'NPC':
        k += 3
        i += 3
    else:
        k = 0
        i += 1
    mx = max(mx, k)
print(mx)

PascalABC

var
    max, k, i: Integer;
    s: String;
    ss: Array of String;
    f: TEXT;
begin
    Assign(f, '24-261.txt');
    Reset(f);
    Readln(f, s);
    max := 0;
    k := 0;
    i := 1;
    while i < s.Length do
    begin
        if s[i: i + 2] = 'EA' then
        begin
            k := k + 2;
            i := i + 2;
        end
        else if (i < s.Length - 1) and (s[i: i + 3] = 'NPC') then
        begin
            k := k + 3;
            i := i + 3;
        end
        else
        begin
            k := 0;
            i := i + 1;
        end;
        if k > max then
            max := k;
    end;
    Writeln(max);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-261.txt");
    string s;
    f >> s;
    int k = 0, max = 0, i = 0;
    while (i < s.length() - 1)
    {
        if (s.substr(i, 2) == "EA")
        {
            k += 2;
            i += 2;
        }
        else if (s.substr(i, 3) == "NPC")
        {
            k += 3;
            i += 3;
        }
        else
        {
            k = 0;
            i++;
        }
        if (k > max)
            max = k;
    }
    cout << max << endl;
}

Ответ

135

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

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

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

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