Задания
Версия для печати и копирования в MS Word

Тек­сто­вый файл со­сто­ит не более, чем из 107 строч­ных букв ан­глий­ско­го ал­фа­ви­та. Най­ди­те мак­си­маль­ную длину под­стро­ки, в ко­то­рой сим­во­лы a и d не стоят рядом.

Для вы­пол­не­ния этого за­да­ния сле­ду­ет на­пи­сать про­грам­му. Ниже при­ведён файл, ко­то­рый не­об­хо­ди­мо об­ра­бо­тать с по­мо­щью дан­но­го ал­го­рит­ма.

За­да­ние 24

Спрятать решение

Ре­ше­ние.

За­ме­ня­ем все вхож­де­ния «da» и «ad» на стро­ки «d a» и «a d». Таким об­ра­зом, между лю­бы­ми рядом сто­я­щи­ми a и d будет про­бел. После этого раз­де­ля­ем стро­ку по про­бе­лам и на­хо­дим мак­си­маль­ную длину по­лу­чив­ших­ся под­строк.

 

Пас­каль

var f: text;

    s: string;

    ar_s: array of string;

    m, i: integer;

begin

    assign(f, '24.txt');

    f.reset();

    readln(f, s);

    s := s.replace('da', 'd a').replace('ad', 'a d');

    m := 0;

    ar_s := s.split();

    for i := 0 to ar_s.Length - 1 do

        if ar_s[i].Length > m then

            m := ar_s[i].Length;

    writeln(m);

end.

Python

f = open('24.txt')

s = f.readline()\

    .replace('ad', 'a d')\

    .replace('da', 'd a')

w = list(map(len, s.split()))

print(max(w))

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла в усло­вии по­лу­ча­ем ответ  — 2252.

 

При­ведём дру­гое ре­ше­ние.

Ми­ни­маль­ная длина по­сле­до­ва­тель­но­сти равна 1, по­то­му что стро­ка из од­но­го сим­во­ла не может со­дер­жать рядом сто­я­щих d и a. На­чи­на­ем про­ве­рять от вто­ро­го сим­во­ла в стро­ке. Если преды­ду­щий и те­ку­щий сим­во­лы в стро­ке не об­ра­зу­ют стро­ку da или ad, уве­ли­чи­ва­ем длину те­ку­щей под­стро­ки на 1, иначе на­чи­на­ем новую под­стро­ку. После каж­до­го из­ме­не­ния длины про­ве­ря­ем на мак­си­мум.

 

Пас­каль

var f: text;

    s: string;

    c, m, i: integer;

begin

    assign(f, '24.txt');

    f.reset(); readln(f, s);

    c := 1; m := 0;

    for i := 2 to s.Length do begin

        if not(s[i-1:i+1] in ['da', 'ad']) then

            c := c + 1

        else c := 1;

        m := max(m, c);

    end;

    writeln(m);

end.

Python

f = open('24.txt')

s = f.readline()

c, m = 1, 0

for i in range(1, len(s)):

    if s[i-1:i+1] not in ['da', 'ad']:

        c += 1

    else:

        c = 1

    m = max(m, c)

print(m)

С++

#include <iostream>

#include <fstream>

using namespace std;

int main(){

    ifstream f("24.txt");

    string s;

    f >> s;

    int c = 1, m = 0;

    for(int i=1; i<s.length(); i++){

        if(!(s[i-1] =='d' && s[i] == 'a' || s[i-1] =='a' && s[i] == 'd'))

            c = c + 1;

        else

            c = 1;

        if(m < c) m = c;

    }

    std::cout << m;

}

 

Ответ: 2252.

 

При­ме­ча­ние. Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

При­ве­дем ре­ше­ние Бо­ри­са Са­ве­лье­ва на языке Python.

f = open('24.txt').readline()

cnt = 0

maxi = 0

for i in range (0,len(f)-1):

if (f[i]=='d' and f[i+1]=='a') or (f[i]=='a' and f[i+1]=='d'):

maxi = max(cnt+1,maxi)

cnt = 0

else:

cnt += 1

print(maxi)

 

При­ве­дем ре­ше­ние Ильи Ан­дри­а­но­ва на языке Python.

s = open('24.txt').readline()

s = s.replace('ad', 'a d').replace('da', 'd a')

print(max([len(x) for x in s.split()]))

Источник: ЕГЭ по ин­фор­ма­ти­ке 24.06.2021. Ос­нов­ная волна
Раздел кодификатора ФИПИ: