Редакция для Тайное послание


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Автор: montes332

Разбор задачи «Тайное послание»

Идея задачи

Нам даны две строки s и t. Нужно определить, является ли строка t строкой s, записанной в обратном порядке.

Иначе говоря, если перевернуть строку s, то должна получиться ровно строка t.


Как понять задачу

Рассмотрим пример:

  • s = code
  • если записать её справа налево, получим edoc

Значит, если t = edoc, ответ YES.

Ещё пример:

  • s = hello
  • обратная строка: olleh
  • если t = hlelo, то это уже не подходит

Ответ будет NO.


Наблюдение

Никаких сложных преобразований здесь нет.

Нужно сделать всего одно действие:

  1. Перевернуть строку s
  2. Сравнить результат со строкой t

Если строки совпали — выводим YES, иначе — NO.


Почему это решение правильное

По условию требуется проверить, равна ли строка t строке s, записанной в обратном порядке.

Если мы действительно перевернули s, то получили ровно ту строку, которая и должна быть во втором сообщении по условию.

Тогда:

  • если перевёрнутая s равна t, ответ должен быть YES
  • если не равна, ответ должен быть NO

То есть наш алгоритм в точности проверяет то, что требуется в задаче.


Пошаговый алгоритм

  1. Считать строки s и t
  2. Перевернуть строку s
  3. Сравнить перевёрнутую строку со строкой t
  4. Вывести YES или NO

Разбор примеров

Пример 1

s = code

Переворачиваем:

edoc

Если t = edoc, то ответ:

YES

Пример 2

s = star

Переворачиваем:

rats

Если t = rats, то ответ:

YES

Пример 3

s = hello

Переворачиваем:

olleh

Но дана строка hlelo, а это не то же самое.

Значит, ответ:

NO


Реализация на C++

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    string s, t;
    cin >> s >> t;

    reverse(s.begin(), s.end());

    if (s == t) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }

    return 0;
}
Пояснение к коду на C++
  • cin >> s >> t; считывает две строки
  • reverse(s.begin(), s.end()); переворачивает строку s
  • дальше обычное сравнение строк: s == t

Если строки равны, печатаем YES, иначе NO.


Реализация на Python

s = input()
t = input()

if s[::-1] == t:
    print("YES")
else:
    print("NO")
Пояснение к коду на Python

В Python запись s[::-1] означает «взять строку в обратном порядке».

То есть:

  • s[::-1] — это перевёрнутая строка s
  • если она равна t, печатаем YES
  • иначе печатаем NO

Оценка сложности

Пусть длина строки равна n.

  • Переворот строки занимает O(n)
  • Сравнение строк тоже занимает O(n)

Итоговая сложность:

  • Время: O(n)
  • Память: O(1) дополнительно в C++ и O(n) для среза в Python

При ограничениях задачи это очень быстро.


Частые ошибки

1. Сравнивать строки без переворота

Некоторые по невнимательности проверяют просто s == t.

Но по условию нужно сравнивать t не с s, а с перевёрнутой s.

2. Перепутать направление

Нужно именно записать первую строку справа налево.

3. Пытаться делать слишком сложное решение

Здесь не нужны циклы с множеством условий, массивы частот и другие сложные конструкции. Задача решается прямой проверкой обратной строки.


Комментарии

Еще нет ни одного комментария.