Задача 5464. Источник: Поляков. Задание КИМ 24
Текстовый файл 24-224.txt содержит строку из символов A, B и C, всего не более чем 106 символов. Найдите максимальную длину строки, состоящей только из комбинаций BAC и СAB. Например, в строке BABABACCABCABCB такая подстрока BACCABCAB (длина 9).
Решение
В данной задаче последний символ одной последовательности может являться первым символом следующей последовательности. Анализируем тройки символов. Если встретили одну из указанных троек, текущая последовательность продолжается и смещаемся на три символа. Если последовательность прервалась, проверяем, не является ли последний символ началом новой последовательности. Если новая последовательность не началась, смещаемся на один символ.
Python
s = open('24-224.txt').readline()
mx = 0
k = 0
i = 0
while i < len(s) - 2:
if s[i:i + 3] == 'BAC' or s[i:i + 3] == 'CAB':
k += 3
mx = max(mx, k)
i += 3
elif i > 0 and (s[i - 1:i + 2] == 'BAC' or s[i - 1:i + 2] == 'CAB'):
k = 3
i += 2
else:
k = 0
i += 1
print(mx)
PascalABC
var
k, i, max: Integer;
s: String;
f: TEXT;
begin
Assign(f, '24-224.txt');
Reset(f);
Readln(f, s);
max := 0;
k := 0;
i := 1;
while i <= s.Length - 2 do
if (s[i:i + 3] = 'BAC') or (s[i:i + 3] = 'CAB') then
begin
k := k + 3;
if k > max then
max := k;
i := i + 3;
end
else if (i > 1) and ((s[i - 1:i + 2] = 'BAC') or (s[i - 1:i + 2] = 'CAB')) then
begin
k := 3;
i := i + 2;
end
else
begin
k := 0;
i := i + 1;
end;
Writeln(max);
end.
C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("24-224.txt");
string s;
f >> s;
int max = 0, k = 0, i = 0;
while (i < s.length() - 2)
if (s.substr(i, 3) == "BAC" || s.substr(i, 3) == "CAB")
{
k += 3;
if (k > max)
max = k;
i += 3;
}
else if (i > 0 && (s.substr(i - 1, 3) == "BAC" || s.substr(i - 1, 3) == "CAB"))
{
k = 3;
i += 2;
}
else
{
k = 0;
i++;
}
cout << max << endl;
}
Ответ
72