Тема 24. Программирование - Обработка символьной информации
24.03 Обработка символьной информации (Сложнее ЕГЭ)
Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела программирование - обработка символьной информации
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#37826

В единственной строке файла 24.txt находится строка s  состоящая не более чем из 107  маленьких букв английского алфавита. Определите можно ли добавить некоторое(возможно нулевое) количество букв «a» в начало строки, чтобы строка стала палиндромом.

Напомним вам, что палиндромом называются строки, которые читаются одинаково как слева-направо, так и справа-налево.

В ответ запишите наименьшее необходимое количество букв «a», а если строку s невозможно сделать палиндромом проделывая описанную операцию — запишите в ответ − 1  .

Вложения к задаче
Показать ответ и решение

Оптимальное решение: проверим, что вся строка s  не состоит только из букв «a», потому что если она состоит, то она уже является палиндромом и ответ 0  . Иначе подсчитаем количество букв «a» стоящих в начале строки s  и количество букв «a» стоящих в конце строки. Если в конце строки стоит меньше букв «a», чем в начале, то добавляя буквы «a» в начало вы точно не сделаете строку палиндромом, поэтому ответ − 1  . Иначе, давайте добавим необходимое количество букв «a» в начало строки и после этого проверим, что полученная строка является палиндромом. Такое решение работает за три прохода по строке, то есть за O (N  + N + N) = O(N )  .

Решение на C++

ifstream in("24.txt");
//Проверяем является ли строка палиндромом, никак лучше чем по определению мы
//этого сделать не можем На самом деле можем при помощи полиномиальных хешей, но
//поля этого файла слишком малы, чтобы писать хеши.
bool ispalindrome(string s) {
    int n = s.size();
    for (int i = 0; n - 1 - i > i; ++i) {
        if (s[i] != s[n - 1 - i]) {
            return false;
        }
    }
    return true;
}
void solve() {
    string s;
    //считываем строку

    in >> s;
    int n = s.size();
    //проверим, правда ли строка s состоит только из букв ’a’, если это так, то
    //строка уже является палиндромом
    bool flag = true;
    for (int i = 0; i < n; ++i){
        if (s[i] != ’a’) {
            flag = false;
            break;
        }
    }
    if (flag) {
        cout << "0\n";
        return;
    }
                                                                                                     
                                                                                                     
    //подсчитаем количество букв ’a’ в начале и в конце строки, чтобы
    //подсчитать, сколько букв необходимо добавить.
    int cnt_l = 0;
    int cnt_r = 0;
    for (int l = 0; s[l] == ’a’; ++l) {
        ++cnt_l;
    }
    for (int r = n - 1; s[r] == ’a’; --r) {
        ++cnt_r;
    }
    //если в конце строки букв ’a’ уже меньше, то добавляя ’a’ слева мы не
    //сможем сделать строку палиндромом
    if (cnt_r < cnt_l) {
        cout << "-1\n";
        return;
    }
    //добавим необходимое количество букв ’a’ и проверим, что действительно
    //получился палиндром
    string added = "";
    for (int i = 0; i < cnt_r - cnt_l; ++i) {
        added += "a";
    }
    s = added + s;
    cout << (ispalindrome(s) ? cnt_r - cnt_l : -1) << ’\n’;
    return;
}

 

Решение на Python

f = open("24.txt")
s = f.readline()
if len(s) == s.count("a"):
    print(0)
else:
    l, r = 0, 0
    i = 0
    while s[i] == "a" and i < len(s):
        l += 1
        i += 1
    i = len(s) - 1
    while s[i] == "a" and i >= 0:
        r += 1
        i -= 1
    if l > r:
        print(-1)
    else:
        s = "a" * (r - l) + s
        # проверка строки на палиндромность
        f = True
        for i in range(len(s) // 2):
            if s[i] != s[len(s) - i - 1]:
                f = False
        if f:
            print(r - l)
        else:
            print(-1)

Ответ: 1483099

Ошибка.
Попробуйте повторить позже

Задача 2#29922

Текстовый файл состоит не более чем из 106  символов ’(’ и ’)’. Известно, что правильная скобочная последовательность берет начало в начале файла. Вам необходимо узнать какую максимальну длину имеет правильная скобочная последовательность. Правильная скобочная последовательность - последовательность скобок, которая подчиняется нескольким правилам:

1) Последовательность начинается с открывающейся скобки

2) Каждая открывающаяся скобка имеет в пару закрывающаяся скобку

3) Количество открывающихся скобок в любой точке скобочной последовательности больше либо равно количеству закрывающихся

Примеры правильных скобочных последовательностей: ()()()  , ()(()())  .

Для выполнения этого задания следует написать программу. Воспользуйтесь файлом "Задание_50_ДЗ". В ответе запишите длину искомой последовательности.

Вложения к задаче
Показать ответ и решение
f = open(’Задание_50_ДЗ.txt’)  
s = f.read()  
count_left = 1  
count_right = 0  
for i in range(1, len(s)):  
    if s[i] == ’(’:  
        count_left += 1  
    else:  
        if count_left > count_right:  
            count_right += 1  
        else:  
            break  
print(count_right + count_left)

Ответ: 10084

Ошибка.
Попробуйте повторить позже

Задача 3#29919

Текстовый файл состоит не более чем из 104  строк, каждая из которых состоит не менее чем из 10 и не более чем из      103  заглавных букв A  , B  , C  , D  . Найдите количество строк, в которых либо изначально есть 10-символьный палиндром, либо его можно получить перестановкой пары символов из данной подстроки. Например, для строки ABAB  можно поменять символы A  и B  местами.

Для выполнения этого задания следует написать программу. Воспользуйтесь файлом "Задание_47_ДЗ". В ответе запишите искомое количество строк.

Вложения к задаче
Показать ответ и решение
def perest(arr):
    for i in range(10):
        for j in range(i + 1, 10):
            b = arr.copy()
            b[i], b[j] = b[j], b[i]
            if b == b[::-1]:
                return True
    return False

n = 1000
f = open("Задание_47_ДЗ.txt")
ans = 0
for i in range(n):
    s = f.readline()
    if len(s) > 9:
        for j in range(len(s) - 9):
            arr = list(s[j:j + 10])
            if perest(arr):
                ans += 1
                break
print(ans)

Ответ: 934

Ошибка.
Попробуйте повторить позже

Задача 4#29918

Текстовый файл состоит не более чем из 106  заглавных букв латинского алфавита. Гарантируется, что количество символов в строке четное. Вам нужно заменить некоторые латинские буквы на другие таким образом, чтобы из символов строки можно было составить палиндром. Например, для строки AVRORA можно заменить O на V или V на O, тогда из данного набора букв мы сможем составить палиндром.

Для выполнения этого задания следует написать программу. Воспользуйтесь файлом "Задание_46_ДЗ". В ответе запишите минимальное количество замен, которые нужно сделать.

Вложения к задаче
Показать ответ и решение
f = open("Задание_46_ДЗ.txt")  
s = f.read()  
# используем индексы буквы в таблице ASCII  
# A - 65, Z - 90  
ar = [0] * 100  
for i in range(len(s)):  
    ar[ord(s[i])] += 1  
# Если какой-то символ встречается нечетное число раз  
# то 1 экземпляр этого символа можно поменять на другой символ,  
# который тоже встречается нечетное число раз  
# так как строка имеет четную длину, если найдется символ,  
# который встречается  
# нечетное число раз, то к нему всегда найдется пара  
ans = 0  
for i in range(65, 91):  
    if ar[i] % 2 == 1:  
        ans += 1  
# мы получили количество символов, которые встретились  
# нечетное число раз,  
# мы можем поменять ровно половину из них, а другую не трогать  
print(ans//2)

 

Ответ: 5

Ошибка.
Попробуйте повторить позже

Задача 5#29888

Текстовый файл состоит не более чем из 103  строк, каждая из которых состоит не более чем из 106  заглавных букв латинского алфавита. Найдите количество нечетных строк (счет с 1) четной длины, в которых количество повторений символа A  кратно трем, при этом в первой половине строки количество сочетаний AR  не меньше количества сочетаний KARP  , а во второй половине количество символов M  не должно превышать количество символов O  .

Для выполнения этого задания следует написать программу. Воспользуйтесь файлом "Задание_16_ДЗ". В ответе запишите искомое количество.

Вложения к задаче
Показать ответ и решение
f = open(’file.txt’)
i = 1
count = 0
for line in f:
    if (i % 2 == 1):
        line = line.strip() # нужно убрать символ переноса строки
        n = len(line)
        if (n % 2 == 0) and (line.count(’A’) % 3 == 0):
            if (line[:n//2].count(’AR’) >= line[:n//2].count(’KARP’)) and\
                    (line[n//2:].count(’M’) <= line[n//2:].count(’O’)):
               count += 1
    i += 1
print(count)

 

Ответ: 5

Ошибка.
Попробуйте повторить позже

Задача 6#23396

Текстовый файл words.txt содержит только заглавные буквы латинского алфавита (ABC...Z). Текст разбит на строки различной длины. Необходимо найти строку, содержащую наибольшее количество пар соседних букв, которые стоят в таком же порядке как и в алфавите (например, AB, BC, CD и т.д.; в цепочке ABC две таких пары). Если таких строк несколько, надо взять ту, которая в файле встретилась раньше.

Выведите максимальное количество пар, встреченных среди всех строк, а также букву из данной строки, которая встречается чаще всего. Если таких букв несколько, вывести ту, что идет раньше по алфавиту.

Пример. Исходный файл:

ZCQABA

ZALMAC

CRACUT

В этом примере в первой и второй строках по одной подходящей паре (AB и LM), в третьей таких пар нет. Берём первую строку, т.к. она раньше встречается в файле. В этой строке чаще других встречается буква А. Если бы она была не единственной, то выбрали ту букву, что раньше стоит в алфавите. В ответе для этого примера надо записать 1A.

Вложения к задаче
Показать ответ и решение

Решение 1

f = open(’words.txt’)
s = []

while True:
    # считываем строку
    line = f.readline().replace(’\n’, ’’)
    # прерываем цикл, если строка пустая
    if not line:
        break
    s.append(line)

maxim = 0
letter = ’’
for i in range(len(s)):
    count = 0
    for j in range(len(s[i])-1):
        if ord(s[i][j]) == ord(s[i][j+1]) - 1:
            count += 1
    if count > maxim:
        maxim = count
        t = sorted(s[i])
        maxim_letter = 0
        for k in t:
            if t.count(k) > maxim_letter:
                maxim_letter = t.count(k)
                letter = k
print(maxim, letter, sep = ’’)

 

Решение 2

f = open(’words.txt’)
n = 1000
ans = ’’
ma = 0
for i in range(n):
    count = 0
    s = f.readline()
    s = s.strip() #чтобы убрать символ переноса строки
    for j in range(len(s) - 1):
        if ord(s[j]) + 1 == ord(s[j+1]):
            count += 1
    if count > ma:
        ma = count
        ans = s

alf = [0] * 26
for i in range(len(ans)):
    alf[ord(ans[i]) - 65] += 1

bukva = ’’
maxim = max(alf)
for i in range(26):
    if alf[i] == maxim:
        bukva = chr(i + 65)
        break

print(ma, bukva)

Ответ: 31C
Рулетка
Вы можете получить скидку в рулетке!