Задача 6650. Источник: Поляков. Задание КИМ 24
(Е. Джобс) Текстовый файл 24-264.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и цифры. Определите максимальную длину подстроки, которая состоит из четных чисел, разделенных буквенными комбинациями (без цифр от 0 до 9). Все цифры в числах должны быть значащими. Например, в строке AS0256DG124FB2NHF1643GH124GG22ABCDF942AACV таких подстрок две: 124FB2 и 124GG22ABCDF942. Максимальная длина – 15. Число 256 в такой строке не участвует в формировании искомой строки, так как цифровая последовательность, начинающаяся после буквы слева, начинается на 0.
Решение
Обрабатываем строку посимвольно. В переменной last будем хранить начальную позицию первого найденного четного числа, за которым не было нечетных чисел или чисел, начинающихся с нуля. Если такого числа не было, то last имеет значение несуществующего индекса. Пока встречаются цифры, в переменной d будем накапливать строку с текущим числом. Встретив букву, анализируем ситуацию. Если d содержит четное число без незначащих нулей и last хранит позицию, обрабатываем длину строки на максимальное значение. Если d четное без незначащих нулей, но ранее четного числа не было, то сохраняем в last индекс первого символа числа. Если число нечетное или начинается с незначащих нулей, сбрасываем last в недействительное значение.
Python
s = open('24-264.txt').readline()
last = -1
mx = 0
d = ''
for i in range(len(s)):
if s[i] in '0123456789':
d += s[i]
else:
if len(d) > 0:
if d[-1] in '02468':
if last != -1:
if d[0] != '0':
mx = max(mx, i - last)
else:
last = -1
else:
last = i - len(d)
else:
last = -1
d = ''
print(mx)
PascalABC
var
i, max, last: Integer;
s, d: String;
f: TEXT;
begin
Assign(f, '24-264.txt');
Reset(f);
Readln(f, s);
last := 0;
max := 0;
d := '';
for i := 1 to s.Length do
if s[i] in '0123456789' then
d := d + s[i]
else
begin
if d.Length > 0 then
if d[d.Length] in '02468' then
if last <> 0 then
if d[1] <> '0' then
begin
if i - last > max then
max := i - last;
end
else
last := 0
else
last := i - d.Length
else
last := 0;
d := ''
end;
Writeln(max);
end.
C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("24-264.txt");
string s, d = "", all = "0123456789", even = "02468";
f >> s;
int last = -1, max = 0;
for (int i = 0; i < s.length(); i++)
if (all.find(s[i]) != -1)
d += s[i];
else
{
if (d.length() > 0)
if (even.find(d[d.length() - 1]) != -1)
if (last != -1)
if (d[0] != '0')
{
if (i - last > max)
max = i - last;
}
else
last = -1;
else
last = i - d.length();
else
last = -1;
d = "";
}
cout << max << endl;
}
Ответ
70