Редакция для Сборка фрагментов
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.
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно восстановить сообщение из n фрагментов, которые уже даны в правильном порядке. По условию итоговое сообщение получается простой склейкой всех фрагментов подряд, без разделителей и без каких-либо преобразований.
Значит, задача сводится к очень простой операции: прочитать все строки и приписать их друг к другу в том же порядке.
2. Наблюдения
- Порядок фрагментов менять нельзя — он уже соответствует времени поступления.
- Между фрагментами не нужно вставлять пробелы, переводы строк или другие символы.
- Каждый фрагмент состоит из символов без пробелов, поэтому его удобно читать как обычную строку.
- Ограничение на суммарную длину всех фрагментов не слишком большое, поэтому можно просто собрать итоговую строку целиком.
Пример:
- фрагменты:
ab,C3,!? - результат:
abC3!?
3. Алгоритм
- Считать число
n. - Завести строку-ответ или список строк.
nраз считать очередной фрагмент.- Добавить его в конец ответа.
- После обработки всех фрагментов вывести результат.
4. Почему это работает
По условию итоговое сообщение получается именно конкатенацией всех фрагментов в порядке поступления.
То есть если фрагменты равны:
s1s2s3- ...
sn
то ответ должен быть равен:
s1 + s2 + s3 + ... + sn
Наш алгоритм делает ровно это:
- читает фрагменты по порядку;
- каждый следующий дописывает в конец;
- в результате получает точную склейку всех строк.
Следовательно, алгоритм всегда восстанавливает правильное сообщение.
5. Сложность
Пусть суммарная длина всех фрагментов равна L.
- По времени:
O(L), потому что каждый символ нужно прочитать и добавить в ответ. - По памяти:
- в C++ решение хранит итоговую строку:
O(L); - в Python решение хранит список строк и итоговую склейку при выводе:
O(L).
- в C++ решение хранит итоговую строку:
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))
Комментарии