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

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

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

(Е. Фокин) Текстовый файл 24-252.txt состоит не более чем из 106 символов и содержит только буквы латинского алфавита и десятичные цифры. Найдите максимальную длину подстроки, ограниченной с двух сторон одним и тем же символом и не содержащей этого символа в середине. В ответе укажите сначала символ, ограничивающий строку, а затем без разделителей длину найденной строки, включая граничные символы. Если в строке есть несколько подходящих подстрок одинаковой длины, нужно указать символ, имеющий больший числовой код. Например, для строки ABCDABECD ответом будет D6.

Решение

Решение данной задачи возможно с использованием метода split. В данном способе обязательно нужно проверять, входят ли первая и последняя подстроки в анализируемые, т.е. начинается ли или заканчивается ли строка рассматриваемым символом.

Python через split

s = open('24-252.txt').readline()
mxc = ''
mx = 0
for c in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ':
    sl = s.split(c)
    if s[0] != c:
        del sl[0]
    if s[-1] != c:
        del sl[-1]
    for i in sl:
        if len(i) + 2 >= mx:
            mxc = c
            mx = len(i) + 2
print(mxc, mx, sep='')

PascalABC через split

var
    max: Integer;
    s, i: String;
    sl: Array of String;
    c, maxc: Char;
    f: TEXT;
begin
    Assign(f, '24-252.txt');
    Reset(f);
    Readln(f, s);
    max := 0;
    maxc := ' ';
    foreach c in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' do
    begin
        sl := s.Split(c);
        if s[1] <> c then
            sl := sl[1:];
        if s[s.Length] <> c then
            sl := sl[:sl.Length - 1];
        foreach i in sl do
            if i.Length + 2 > max then
            begin
                maxc := c;
                max := i.Length + 2;
            end;
    end;
    Writeln(maxc, max);
end.

Другим вариантом является использование метода поиска в строке find. Обрабатываем пары одинаковых символов и анализируем длину строки между ними.

Python через поиск

s = open('24-252.txt').readline()
mxc = ''
mx = 0
for c in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ':
    last = s.find(c)
    current = s.find(c, last + 1)
    while current != - 1:
        if current - last + 1 >= mx:
            mxc = c
            mx = current - last + 1
        last = current
        current = s.find(c, last + 1)
print(mxc, mx, sep='')

PascalABC через поиск

var
    max, last, current: Integer;
    s: String;
    c, maxc: Char;
    f: TEXT;
begin
    Assign(f, '24-252.txt');
    Reset(f);
    Readln(f, s);
    max := 0;
    maxc := ' ';
    foreach c in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' do
    begin
        last := s.IndexOf(c);
        current := s.IndexOf(c, last + 1);
        while current <> -1 do
        begin
            if current - last + 1 >= max then
            begin
                maxc :=c;
                max := current - last + 1;
            end;
            last := current;
            current := s.IndexOf(c, last + 1);
        end;
    end;
    Writeln(maxc, max);
end.

C++ через поиск

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-252.txt");
    string s;
    char sym[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    f >> s;
    int max = 0;
    char maxc = ' ';
    for (char* c = sym; *c != 0; c++)
    {
        int last = s.find(*c);
        int current = s.find(*c, last + 1);
        while (current != -1)
        {
            if (current - last + 1 >= max)
            {
                maxc = *c;
                max = current - last + 1;
            }
            last = current;
            current = s.find(*c, last + 1);
        }
    }
    cout << maxc << max << endl;
}

Ответ

D9747

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

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

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

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