Ошибка.
Попробуйте повторить позже
В единственной строке файла находится строка состоящая не более чем из маленьких букв английского алфавита. Определите можно ли добавить некоторое(возможно нулевое) количество букв «a» в начало строки, чтобы строка стала палиндромом.
Напомним вам, что палиндромом называются строки, которые читаются одинаково как слева-направо, так и справа-налево.
В ответ запишите наименьшее необходимое количество букв «a», а если строку s невозможно сделать палиндромом проделывая описанную операцию — запишите в ответ .
Оптимальное решение: проверим, что вся строка не состоит только из букв «a», потому что если она состоит, то она уже является палиндромом и ответ . Иначе подсчитаем количество букв «a» стоящих в начале строки и количество букв «a» стоящих в конце строки. Если в конце строки стоит меньше букв «a», чем в начале, то добавляя буквы «a» в начало вы точно не сделаете строку палиндромом, поэтому ответ . Иначе, давайте добавим необходимое количество букв «a» в начало строки и после этого проверим, что полученная строка является палиндромом. Такое решение работает за три прохода по строке, то есть за .
Решение на 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)
Ошибка.
Попробуйте повторить позже
Текстовый файл состоит не более чем из символов ’(’ и ’)’. Известно, что правильная скобочная последовательность берет начало в начале файла. Вам необходимо узнать какую максимальну длину имеет правильная скобочная последовательность. Правильная скобочная последовательность - последовательность скобок, которая подчиняется нескольким правилам:
1) Последовательность начинается с открывающейся скобки
2) Каждая открывающаяся скобка имеет в пару закрывающаяся скобку
3) Количество открывающихся скобок в любой точке скобочной последовательности больше либо равно количеству закрывающихся
Примеры правильных скобочных последовательностей: , .
Для выполнения этого задания следует написать программу. Воспользуйтесь файлом "Задание_50_ДЗ". В ответе запишите длину искомой последовательности.
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)
Ошибка.
Попробуйте повторить позже
Текстовый файл состоит не более чем из строк, каждая из которых состоит не менее чем из 10 и не более чем из заглавных букв , , , . Найдите количество строк, в которых либо изначально есть 10-символьный палиндром, либо его можно получить перестановкой пары символов из данной подстроки. Например, для строки можно поменять символы и местами.
Для выполнения этого задания следует написать программу. Воспользуйтесь файлом "Задание_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)
Ошибка.
Попробуйте повторить позже
Текстовый файл состоит не более чем из заглавных букв латинского алфавита. Гарантируется, что количество символов в строке четное. Вам нужно заменить некоторые латинские буквы на другие таким образом, чтобы из символов строки можно было составить палиндром. Например, для строки AVRORA можно заменить O на V или V на O, тогда из данного набора букв мы сможем составить палиндром.
Для выполнения этого задания следует написать программу. Воспользуйтесь файлом "Задание_46_ДЗ". В ответе запишите минимальное количество замен, которые нужно сделать.
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)
Ошибка.
Попробуйте повторить позже
Текстовый файл состоит не более чем из строк, каждая из которых состоит не более чем из заглавных букв латинского алфавита. Найдите количество нечетных строк (счет с 1) четной длины, в которых количество повторений символа кратно трем, при этом в первой половине строки количество сочетаний не меньше количества сочетаний , а во второй половине количество символов не должно превышать количество символов .
Для выполнения этого задания следует написать программу. Воспользуйтесь файлом "Задание_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)
Ошибка.
Попробуйте повторить позже
Текстовый файл 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)