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

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

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

(Е. Джобс) Текстовый файл 24-264.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и цифры. Определите максимальную длину подстроки, которая состоит из четных чисел, разделенных буквенными комбинациями (без цифр от 0 до 9). Все цифры в числах должны быть значащими. Например, в строке AS0256DG124FB2NHF1643GH124GG22ABCDF942AACV таких подстрок две: 124FB2 и 124GG22ABCDF942. Максимальная длина – 15. Число 256 в такой строке не участвует в формировании искомой строки, так как цифровая последовательность, начинающаяся после буквы слева, начинается на 0.

Решение

Обрабатываем строку посимвольно. В переменной last будем хранить начальную позицию первого найденного четного числа, за которым не было нечетных чисел или чисел, начинающихся с нуля. Если такого числа не было, то last имеет значение несуществующего индекса. Пока встречаются цифры, в переменной d будем накапливать строку с текущим числом. Встретив букву, анализируем ситуацию. Если d содержит четное число без незначащих нулей и last хранит позицию, обрабатываем длину строки на максимальное значение. Если d четное без незначащих нулей, но ранее четного числа не было, то сохраняем в last индекс первого символа числа. Если число нечетное или начинается с незначащих нулей, сбрасываем last в недействительное значение.

Python

s = open('24-264.txt').readline()
last = -1
mx = 0
d = ''
for i in range(len(s)):
    if s[i] in '0123456789':
        d += s[i]
    else:
        if len(d) > 0:
            if d[-1] in '02468':
                if last != -1:
                    if d[0] != '0':
                        mx = max(mx, i - last)
                    else:
                        last = -1
                else:
                    last = i - len(d)
            else:
                last = -1
        d = ''
print(mx)

PascalABC

var
    i, max, last: Integer;
    s, d: String;
    f: TEXT;
begin
    Assign(f, '24-264.txt');
    Reset(f);
    Readln(f, s);
    last := 0;
    max := 0;
    d := '';
    for i := 1 to s.Length do
        if s[i] in '0123456789' then
            d := d + s[i]
        else
        begin
            if d.Length > 0 then
                if d[d.Length] in '02468' then
                    if last <> 0 then
                        if d[1] <> '0' then
                        begin
                            if i - last > max then
                                max := i - last;
                        end
                        else
                            last := 0
                    else
                        last := i - d.Length
                else
                    last := 0;
            d := ''
        end;
    Writeln(max);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-264.txt");
    string s, d = "", all = "0123456789", even = "02468";
    f >> s;
    int last = -1, max = 0;
    for (int i = 0; i < s.length(); i++)
        if (all.find(s[i]) != -1)
            d += s[i];
        else
        {
            if (d.length() > 0)
                if (even.find(d[d.length() - 1]) != -1)
                    if (last != -1)
                        if (d[0] != '0')
                        {
                            if (i - last > max)
                                max = i - last;
                        }
                        else
                            last = -1;
                    else
                        last = i - d.length();
                else
                    last = -1;
            d = "";
        }
    cout << max << endl;
}

Ответ

70

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

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

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

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