Задача 6407. Источник: Поляков. Задание КИМ 24
Текстовый файл 24-257.txt состоит не более чем из 106 символов и содержит только буквы латинского алфавита. Группа из трёх идущих подряд символов, содержащая по одному разу каждую из букв A, C и F, считается разделителем. Разделители могут накладываться друг на друга, например, последовательность символов AFCAF считается идущими подряд разделителями AFC, FCA и CAF. Определите количество символов в самом длинном фрагменте, полученном после удаления разделителей.
Пример. В строке CORAFCAFROCKCFAAC. Разделители в этой строке выделены жирным шрифтом. После удаления разделителей остается три фрагмента: COR, ROCK и AC. Самый длинный из них содержит 4 символа. Ответ: 4.
Решение
Просматриваем посимвольно строку и анализируем следующую тройку символов. Если эта тройка является комбинацией разделителей, то инициализируем счетчик значением -2, чтобы не учитывать следующие два символа разделителя. В противном случае, увеличиваем счетчик на единицу.
Python
s = open('24-257.txt').readline()
k = 0
mx = 0
for i in range(len(s)):
if set(s[i:i + 3]) == set('ACF'):
k = -2
else:
k += 1
mx = max(mx, k)
print(mx)
PascalABC
var
max, k, i: Integer;
s, z: String;
f: TEXT;
begin
Assign(f, '24-257.txt');
Reset(f);
Readln(f, s);
max := 0;
k := 0;
for i := 1 to s.Length do
begin
if i < s.Length -1 then
z := s[i:i + 3]
else
z := '';
if ('A' in z) and ('C' in z) and ('F' in z) then
k := -2
else
begin
k := k + 1;
if k > max then
max := k;
end;
end;
Writeln(max);
end.
C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("24-257.txt");
string s;
f >> s;
int k = 0, max = 0;
for (int i = 0; i < s.length(); i++)
{
string z = s.substr(i, 3);
if (z.find('A') != -1 && z.find('C') != -1 && z.find('F') != -1)
k = -2;
else
{
k++;
if (k > max)
max = k;
}
}
cout << max << endl;
}
Ответ
532