Задача 6055. Источник: Поляков. Задание КИМ 24
Текстовый файл 24-241.txt состоит не более чем из 106 символов и содержит только латинские буквы A, B, C, D, E, F, O. Определите длину самой длинной цепочки символов, которая начинается и заканчивается буквой F, между двумя последовательными буквами F содержит не менее пяти букв E, а между каждой парой букв E – ровно одну букву A.
Решение
Наиболее простое решение данной задачи через использование метода split. Делим строку на подстроки и анализируем в соответствии с логикой задачи.
Python
s = open('24-241.txt').readline()
mx = 0
for i in s.split('F')[1:-1]:
if i.count('E') > 4:
good = True
for j in i.split('E')[1:-1]:
if j.count('A') != 1:
good = False
break
if good:
mx = max(mx, len(i) + 2)
print(mx)
PascalABC
function Count(s: String; c: Char): Integer;
var
i: Integer;
begin
result := 0;
for i := 1 to s.Length do
if s[i] = c then
result := result + 1;
end;
var
max: Integer;
s, i, j: String;
sl, se: Array of String;
good: Boolean;
f: TEXT;
begin
Assign(f, '24-241.txt');
Reset(f);
Readln(f, s);
sl := s.Split('F');
max := 0;
foreach i in sl[1:sl.Length - 1] do
if Count(i, 'E') > 4 then
begin
good := True;
se := i.Split('E');
foreach j in se[1:se.Length - 1] do
if Count(j, 'A') <> 1 then
begin
good := False;
break;
end;
if good and (i.Length + 2 > max) then
max := i.Length + 2;
end;
Writeln(max);
end.
C++
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int count(string s, char c)
{
int n = 0;
for (int i = 0; i < s.length(); i++)
if (s[i] == c)
n++;
return n;
}
vector<string> split(string s, char c)
{
vector<string> r;
int last = -1, cur = s.find(c);
while (cur != -1)
{
r.push_back(s.substr(last + 1, cur - last - 1));
last = cur;
cur = s.find(c, cur + 1);
}
r.push_back(s.substr(last + 1, s.length() - last - 1));
return r;
}
int main()
{
ifstream f;
f.open("24-241.txt");
string s;
f >> s;
vector<string> sl = split(s, 'F');
sl.erase(sl.begin());
sl.erase(sl.end() - 1);
int max = 0;
for (string i : sl)
if (count(i, 'E') > 4)
{
bool good = true;
vector<string> se = split(i, 'E');
se.erase(se.begin());
se.erase(se.end() - 1);
for (string j : se)
if (count(j, 'A') != 1)
{
good = false;
break;
}
if (good && i.length() + 2 > max)
max = i.length() + 2;
}
cout << max << endl;
}
Ответ
35