Задача 6286. Источник: Поляков. Задание КИМ 24
Текстовый файл 24-164.txt состоит не более чем из 106 символов и содержиттолько буквы латинского алфавита. Текст разбит на строки различной длины. Для каждой строки нужно определить букву (или буквы), которая встречается в этой строке чаще всего после буквы X. Все эти буквы добавляются в новый список. Найдите букву, которая чаще всего встречается в построенном списке, и в качестве ответа укажите, сколько раз она там встретилась. Например, пусть файл содержит две строки:
XAXBXAXBCXX
BXAXCXCXAXD
В первой строке чаще всего после буквы X встречаются буквы А и B (по 2 раза), а во второй строке – буквы A и С (по 2 раза). В итоге должен быть построен список [A, B, A, C], в котором чаще всего (2 раза) встречается буква A. Ответ: 2.
Решение
Построчно считываем файл. Для каждой строки подсчитываем, сколько раз встречалась каждая буква после буквы X и находим максимальное количество. Для всех букв, которые встречаются максимальное количество раз, увеличиваем счетчик в результирующем массиве. После обработки всего файла, находим максимальное значение в результирующем массиве.
Python
f = open('24-164.txt')
r = [0] * 26;
for s in f:
s = s.strip()
k = [0] * 26
for i in range(1, len(s)):
if s[i-1] == 'X':
k[ord(s[i]) - 65] += 1
mx = max(k)
for i in range(26):
if k[i] == mx:
r[i] += 1
print(max(r))
PascalABC
var
max, i: Integer;
s: String;
k, r: Array [0..25] of Integer;
f: TEXT;
begin
Assign(f, '24-164.txt');
Reset(f);
for i := 0 to 25 do
r[i] := 0;
Readln(f, s);
while s <> '' do
begin
for i := 0 to 25 do
k[i] := 0;
for i := 2 to s.Length do
if s[i - 1] = 'X' then
k[ord(s[i]) - 65] := k[ord(s[i]) - 65] + 1;
max := 0;
for i := 0 to 25 do
if k[i] > max then
max := k[i];
for i := 0 to 25 do
if k[i] = max then
r[i] := r[i] + 1;
Readln(f, s);
end;
max := 0;
for i := 0 to 25 do
if r[i] > max then
max := r[i];
Writeln(max);
end.
C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("24-164.txt");
int r[26];
for (int i = 0; i < 26; i++)
r[i] = 0;
string s;
while (f >> s)
{
int k[26];
for (int i = 0; i < 26; i++)
k[i] = 0;
for (int i = 1; i < s.length(); i++)
if (s[i - 1] == 'X')
k[(int)s[i] - 65]++;
int max = 0;
for (int i = 0; i < 26; i++)
if (k[i] > max)
max = k[i];
for (int i = 0; i < 26; i++)
if (k[i] == max)
r[i]++;
}
int max = 0;
for (int i = 0; i < 26; i++)
if (r[i] > max)
max = r[i];
cout << max << endl;
}
Ответ
928