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

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

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

Текстовый файл 24-257.txt состоит не более чем из 106 символов и содержит только буквы латинского алфавита. Группа из трёх идущих подряд символов, содержащая по одному разу каждую из букв A, C и F, считается разделителем. Разделители могут накладываться друг на друга, например, последовательность символов AFCAF считается идущими подряд разделителями AFC, FCA и CAF. Определите количество символов в самом длинном фрагменте, полученном после удаления разделителей.

Пример. В строке CORAFCAFROCKCFAAC. Разделители в этой строке выделены жирным шрифтом. После удаления разделителей остается три фрагмента: COR, ROCK и AC. Самый длинный из них содержит 4 символа. Ответ: 4.

Решение

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

Python

s = open('24-257.txt').readline()
k = 0
mx = 0
for i in range(len(s)):
    if set(s[i:i + 3]) == set('ACF'):
        k = -2
    else:
        k += 1
        mx = max(mx, k)
print(mx)

PascalABC

var
    max, k, i: Integer;
    s, z: String;
    f: TEXT;
begin
    Assign(f, '24-257.txt');
    Reset(f);
    Readln(f, s);
    max := 0;
    k := 0;
    for i := 1 to s.Length do
    begin
        if i < s.Length -1 then
            z := s[i:i + 3]
        else
            z := '';
        if ('A' in z) and ('C' in z) and ('F' in z) then
            k := -2
        else
        begin
            k := k + 1;
            if k > max then
                max := k;
        end;
    end;
    Writeln(max);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-257.txt");
    string s;
    f >> s;
    int k = 0, max = 0;
    for (int i = 0; i < s.length(); i++)
    {
        string z = s.substr(i, 3);
        if (z.find('A') != -1 && z.find('C') != -1 && z.find('F') != -1)
            k = -2;
        else
        {
            k++;
            if (k > max)
                max = k;
        }
    }
    cout << max << endl;
}

Ответ

532

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

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

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

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