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

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

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

(Е. Джобс) Текстовый файл 24-223.txt содержит строку из символов A, B и C, всего не более чем 106 символов. Найдите максимальную длину строки, состоящей только из комбинаций AB и СAС. Например, в строке BABABCACABCB такая подстрока ABABCACAB (длина 9).

Решение

Обрабатываем строку последовательно. Если встретили тройку CAC, то увеличиваем счетчик и индекс обрабатываемого символа на три. Если встретили пару AB, то увеличиваем счетчик и индекс обрабатываемого символа на два. Если не нашлось ни тройки, ни пары не нашлось, то отступаем на шаг назад и проверяем нет ли тройки CAC, т.к. если предыдущая последовательность оканчивается этой тройкой, то последний символ может являться первым символом новой последовательности. Например ABCACACABAB содержит последовательность из 5 и и 7 символов, которые имеют общий символ. Если такой тройки не нашлось, то просто переходим к обработке следующего символа.

Python

s = open('24-223.txt').readline()
mx = 0
k = 0
i = 0
while i < len(s) - 1:
    if s[i:i + 3] == 'CAC':
        k += 3
        mx = max(mx, k)
        i += 3
    elif s[i:i + 2] == 'AB':
        k += 2
        mx = max(mx, k)
        i += 2
    elif i > 0 and s[i - 1:i + 2] == 'CAC':
        k = 3
        i += 2    
    else:
        k = 0
        i += 1
print(mx)

PascalABC

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

C++

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

Ответ

69

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

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

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

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