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

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

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

(Д. Статный) Текстовый файл 24-251.txt состоит не более чем из 106 символов и содержит только латинские заглавные буквы A...Z и десятичные цифры. Определите максимальную длину подстроки, которая ограничена с одной стороной буквой A, а с другой – D и не содержит других букв A и D внутри.

Решение

Находим позиции ближайшей буквы A и ближайшей буквы D. Если позиция буквы A меньше, то проверяем, есть ли другие буквы A до позиции буквы D. Если других букв A не найдено, анализируем длину получившейся подстроки на максимум. Аналогично поступаем, если позиция буквы D меньше позиции буквы A. Повторяем эти действия, осуществляя дальнейший поиск после буквы с минимальной позицией, до тех пор, пока обе буквы находятся в оставшейся строке.

Python

s = open('24-251.txt').readline()
mx = 0
last = 0
while True:
    a = s.find('A', last)
    d = s.find('D', last)
    if a == -1 or d == -1:
        break
    if a < d:
        if d < s.find('A', a + 1):
            mx = max(mx, d - a + 1)
        last = a + 1
    else:
        if a < s.find('D', d + 1):
            mx = max(mx, a - d + 1)
        last = d + 1
print(mx)

PascalABC

var
    max, last, a, d: Integer;
    s: String;
    f: TEXT;
begin
    Assign(f, '24-251.txt');
    Reset(f);
    Readln(f, s);
    max := 0;
    last := 1;
    while True do
    begin
        a := s.IndexOf('A', last);
        d := s.IndexOf('D', last);
        if (a = -1) or (d = -1) then
            break;
        if a < d then
        begin
            if (d < s.IndexOf('A', a + 1)) and (d - a + 1 > max) then
              max := d - a + 1;
            last := a + 1;
        end
        else
        begin
            if (a < s.IndexOf('D', d + 1)) and (a - d + 1 > max) then
              max := a - d + 1;
            last := d + 1;
        end
    end;
    Writeln(max);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-251.txt");
    string s;
    f >> s;
    int max = 0, last = 0;
    while (true)
    {
        int a = s.find('A', last), d = s.find('D', last);
        if (a == -1 || d == -1)
            break;
        if (a < d)
        {
            if (d < s.find('A', a + 1) && d - a + 1 > max)
                max = d - a + 1;
            last = a + 1;
        }
        else
        {
            if (a < s.find('D', d + 1) && a - d + 1 > max)
                max = a - d + 1;
            last = d + 1;
        }
    }
    cout << max << endl;
}

Ответ

273

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

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

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

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