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

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

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

(Е. Джобс) Текстовый файл 24-274.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита. Определите максимальную длину подпоследовательности, которая состоит только из пар символов PC, только из четверок символов CSGO, или из непересекающихся пар символов PC и четверок символов CSGO. Например, в строке ASDPCCSGOPCNGCHPCPCSGOPC есть три подходящие подпоследовательности: PCCSGOPC, РСРС и CSGOPC. Максимальная длина подходящей подпоследовательности – 8.

Решение

Последовательно обрабатываем строку и ищем в ней комбинации PC и CSGO. Найдя комбинацию, увеличиваем счетчик текущей последовательности на 2 или 4 соответственно и на столько же увеличиваем индекс обрабатываемого символа. Следует учитывать, что последний символ последовательности, оканчивающейся на PC может являться первым символом новой последовательности, начинающейся с CSGO. Когда текущая последовательность прерывается, пытаемся откатиться на один символ назад. Если там нет комбинации CSGO, двигаемся на один символ вперед.

Python

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

PascalABC

var
    k, max, i: Integer;
    s: String;
    f: TEXT;
begin
    Assign(f, '24-274.txt');
    Reset(f);
    Readln(f, s);
    k := 0;
    max := 0;
    i := 1;
    while i < s.Length do
    begin
        if s[i: i + 2] = 'PC' then
        begin
            k := k + 2;
            i := i + 2;
        end
        else if (i < s.Length - 3) and (s[i: i + 4] = 'CSGO') then
        begin
            k := k + 4;
            i := i + 4;
        end
        else if (i > 1) and (i < s.Length - 2) and (s[i - 1: i + 3] = 'CSGO') then
        begin
            k := 4;
            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-274.txt");
    string s;
    f >> s;
    int k = 0, max = 0, i = 0;
    while (i < s.length() - 1)
    {
        if (s.substr(i, 2) == "PC")
        {
            k += 2;
            i += 2;
        }
        else if (s.substr(i, 4) == "CSGO")
        {
            k += 4;
            i += 4;
        }
        else if (i > 0 && s.substr(i - 1, 4) == "CSGO")
        {
            k = 4;
            i += 4;
        }
        else
        {
            k = 0;
            i++;
        }
        if (k > max)
            max = k;
    }
    cout << max << endl;
}

Ответ

90

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

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

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

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