Редакция для Сборка фрагментов


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.

1. Идея

Нужно восстановить сообщение из n фрагментов, которые уже даны в правильном порядке. По условию итоговое сообщение получается простой склейкой всех фрагментов подряд, без разделителей и без каких-либо преобразований.

Значит, задача сводится к очень простой операции: прочитать все строки и приписать их друг к другу в том же порядке.

2. Наблюдения

  1. Порядок фрагментов менять нельзя — он уже соответствует времени поступления.
  2. Между фрагментами не нужно вставлять пробелы, переводы строк или другие символы.
  3. Каждый фрагмент состоит из символов без пробелов, поэтому его удобно читать как обычную строку.
  4. Ограничение на суммарную длину всех фрагментов не слишком большое, поэтому можно просто собрать итоговую строку целиком.

Пример:

  • фрагменты: ab, C3, !?
  • результат: abC3!?

3. Алгоритм

  1. Считать число n.
  2. Завести строку-ответ или список строк.
  3. n раз считать очередной фрагмент.
  4. Добавить его в конец ответа.
  5. После обработки всех фрагментов вывести результат.

4. Почему это работает

По условию итоговое сообщение получается именно конкатенацией всех фрагментов в порядке поступления.

То есть если фрагменты равны:

  • s1
  • s2
  • s3
  • ...
  • sn

то ответ должен быть равен: s1 + s2 + s3 + ... + sn

Наш алгоритм делает ровно это:

  • читает фрагменты по порядку;
  • каждый следующий дописывает в конец;
  • в результате получает точную склейку всех строк.

Следовательно, алгоритм всегда восстанавливает правильное сообщение.

5. Сложность

Пусть суммарная длина всех фрагментов равна L.

  • По времени: O(L), потому что каждый символ нужно прочитать и добавить в ответ.
  • По памяти:
    • в C++ решение хранит итоговую строку: O(L);
    • в Python решение хранит список строк и итоговую склейку при выводе: O(L).

6. Код на C++17

#include <iostream>
#include <string>

using namespace std;

int main() {
    int n;
    cin >> n;

    string part;
    string result;

    for (int i = 0; i < n; i++) {
        cin >> part;
        result += part;
    }

    cout << result << '\n';
    return 0;
}

7. Код на Python 3

n = int(input())
parts = []

for _ in range(n):
    parts.append(input())

print("".join(parts))

Комментарии

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