Задача 6182. Источник: Поляков. Задание КИМ 24
(Д. Статный) Текстовый файл 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