СРОЧНО ЯЗЫК С++ ОСТАЛСЯ ЧАС ДАЮ 60 БАЛЛОВ
Измени ширину параграфа
Текст параграфа представляет собой набор слов (последовательности символов с кодами от 33 до 127), разделенных ровно одним пробелом (символом с кодом 32). Ширина параграфа должна составлять не более M
символов.
Требуется получить разбиение этого текста на строки длиной не более чем M
символов. Cлово переносится на следующую строку, только если в текущей строке его разместить уже невозможно. Новая строка не должна начинаться с пробела. Никакая строка не должна заканчиваться пробелом. Последняя строка должна заканчиваться переводом строки (он автоматически образуется при выполнении вызова print в Python без изменения параметра end, а также при выводе endl в поток вывода cout в С++).
Формат входных данных
На вход программе сначала подается число 0
. В следующей строке находится исходный текст. Длина слов в нем не превышает M, слова разделены ровно одним пробелом. В начале и в конце строки пробелы отсутствуют.
Текст содержит как минимум один непробельный символ. Длина текста не превосходит 100000 символов.
Формат выходных данных
Выведите искомое разбиение текста на строки длиной не более M
.
Ввод
Вывод
7
One, two and three.
One,
two and
three.
Ответы
Для решения данной задачи можно использовать алгоритм переноса слов. Мы будем идти по строке, добавляя слова в текущую строку до тех пор, пока не превысим максимальную длину строки. Если при добавлении нового слова длина строки станет больше M, то мы переносим последнее добавленное слово на следующую строку.
Вот код на языке C++, который реализует данный алгоритм:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
int M;
cin >> M;
string text;
getline(cin >> ws, text); // считываем весь текст, пропуская первый ноль и пробельные символы
vector<string> lines; // храним строки в векторе
int start = 0; // начало текущего слова
int end = 0; // конец текущей строки
while (end < text.size()) {
// ищем следующее слово
start = end;
while (start < text.size() && text[start] == ' ') start++;
end = start;
while (end < text.size() && text[end] != ' ') end++;
// добавляем слово в текущую строку
if (end - start + 1 <= M - (lines.empty() ? 0 : lines.back().size())) {
if (!lines.empty()) lines.back() += ' ';
lines.back() += text.substr(start, end - start);
} else { // переносим слово на следующую строку
lines.push_back(text.substr(start, end - start));
}
}
// выводим результат
for (const auto& line : lines) {
cout << line << endl;
}
return 0;
}
Пример входных данных:
7
One, two and three.
Пример выходных данных:
One,
two and
three.
7
One,
two and
three.
One,
two and
three.