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

Тек­сто­вый файл со­сто­ит не более чем из 1 200 000 сим­во­лов X, Y, и Z. Опре­де­ли­те мак­си­маль­ное ко­ли­че­ство иду­щих под­ряд сим­во­лов, среди ко­то­рых нет под­стро­ки XZZY. Для вы­пол­не­ния этого за­да­ния сле­ду­ет на­пи­сать про­грам­му. Ниже при­ведён файл, ко­то­рый не­об­хо­ди­мо об­ра­бо­тать с по­мо­щью дан­но­го ал­го­рит­ма.

За­да­ние 24

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

Ре­ше­ние.

Будем по­сле­до­ва­тель­но счи­ты­вать сим­во­лы из файла, по­сто­ян­но храня по­след­ние 4 введённых сим­во­ла и про­ве­ряя, яв­ля­ют­ся ли они стро­кой XZZY. Если под­стро­ка XZZY не была встре­че­на, при­бав­ля­ем к счётчику k еди­ни­цу, если ис­ко­мая под­стро­ка будет встре­че­на  — про­ве­ря­ем, яв­ля­ет­ся ли те­ку­щее зна­че­ние счётчика k мак­си­маль­ным, об­ну­ля­ем счётчик и при­бав­ля­ем к нему зна­че­ние 3, чтобы учи­ты­вать по­след­ние 3 сим­во­ла под­стро­ки XZZY. То есть в стро­ке XZZYXX мак­си­маль­ное ко­ли­че­ство иду­щих под­ряд сим­во­лов, не со­дер­жа­щих под­стро­ку XZZY, равно 5: ZZYXX.

 

При­ведём ре­ше­ние дан­ной за­да­чи на языке PascalABC.

var k, max: integer;

c1, c2, c3, c4: char;

f: text;

begin

assign(f,'C:\24.txt');

reset(f);

c1 := '0';

c2 := '0';

c3 := '0';

c4 := '0';

k := 0;

max := 0;

while not Eof(f) do begin

c4 := c3;

c3 := c2;

c2 := c1;

read(f, c1);

if (c4 = 'X') and (c3 = 'Z') and (c2 = 'Z') and (c1 = 'Y') then begin

if k > max then

max := k;

k := 0;

k := k + 3;

end

else begin

k := k + 1;

end;

end;

if k > max then

max := k;

writeln(max);

end.

 

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

 

Ответ: 1713.

 

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

 

При­ведём ре­ше­ние Вла­ди­ми­ра Лу­кьян­чи­ко­ва на языке PascalABC.

reset(input, '24.txt');

Print(ReadString.IndicesOf('XZZY').Incremental.Max + 2)

 

При­ведём дру­гое ре­ше­ние на языке Python.

with open("24.txt") as f:

p = f.readline()

max_len = 0

cur_len = 3

for i in range(3, len(p)):

if p[i- 3] == "X" and p[i - 2] == "Z" and p[i - 1] == "Z" and p[i] == "Y":

if max_len < cur_len:

max_len = cur_len

cur_len = 3

else:

cur_len += 1

if max_len < cur_len:

max_len = cur_len

print(max_len)

 

При­ведём ре­ше­ние Па­пу­ша Алек­сея на языке Python.

with open("24.txt","r") as t:

f=t.readline()

max_len=0

cur_len=0

f=f.replace("XZZY","0")

for i in range(len(f)):

if f[i]=="0":

max_len=max(max_len,cur_len+3)

cur_len=3

else:

cur_len+=1

max_len=max(max_len,cur_len)

print(max_len)

 

При­ведём ре­ше­ние Фе­фе­ло­ва Сер­гея на языке Python.

p = open("24.txt").readline()

max_len = cur_len = min(3, len(p))

for i in range(3, len(p)):

if p[i-3:i+1] == "XZZY":

max_len = max(max_len, cur_len)

cur_len = 3

else: cur_len += 1

max_len = max(max_len, cur_len)

print(max_len)

 

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

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

maxi=0

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

maxi=max(len(f[i])+6,maxi)

print(maxi)

 

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

d = [len(s) for s in open('244.txt').readline().split('XZZY')]

d[0] -= 3

d[-1] -= 3

print(max(d) + 6)

 

 

При­ведём ре­ше­ние Алек­сандра Вин­ни­ка на языке Python.

print(len(max(open('24.txt').readline().split('XZZY'), key=lambda x: len(x))) + 6)

 

При­ведём ре­ше­ние Да­ни­и­ла Ком­ле­ва на языке Python.

print(len(max(open('24.txt').readline().split('XZZY'),key=len))+6)

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