Ошибка.
Попробуйте повторить позже
В единственной строке файла находится строка состоящая не более чем из маленьких букв английского алфавита. Определите можно ли добавить некоторое(возможно нулевое) количество букв «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)
Специальные программы
Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!
Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.
Бесплатное обучение
в Школково
Для детей ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Брянской областей, а также школьникам, находящимся в пунктах временного размещения Крыма обучение на платформе бесплатное.
Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».
Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ или олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!
Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!