#include <iostream> // подключение библиотеки ввода-вывода
#include <string> // подключение библиотеки для работы со строками
#include <vector> // подключение библиотеки для работы с векторами

using namespace std; // подключение пространства имён std

int main(){
    string str; // вводимая строка
    vector <string> words; // массив для хранения слов строки (используется вектор для устранения ограничения на размер памяти)
    int start, end; // счётчики массива для корректного добавления слов
    int skip_count; // счтётчик пропусков

    // ввод строк
    cout << "Input stroke:\n\n";
    getline(cin, str);

	if (str.empty()){ // если строка пуста, то
		cout << "String can't be empty" << endl; // вывод сообщения об ошибке
		return 0; // завершение программы
	}

    // обнуляем счётчики
    start = 0;
    end = 0; 
    skip_count = 0;

    for (int i = 0; i <= str.size(); i++) { // цикл на прохождение строки
        if (skip_count > 0){ // если есть ряд символов без букв
            skip_count--; // уменьшаем счётчик пропусков
            continue; // переходим на следующую итерацию до следующей буквы в строке
        }
        if (ispunct(str[i]) || isspace(str[i]) || str[i] == '\0'){ // если текущий символ строки не является буквой, то
            skip_count = 0; // обнуляем счётчик от нового слова
            end = i; // счётчик окончания равен текущему значению i
            words.push_back(str.substr(start, (end-start))); // добавляем в массив слов часть строки от значения счётчика start. 
            // (end - start) нужен для вычисления количества символов

            while (ispunct(str[end]) || isspace(str[end])){ // пока текущий символ не является буквой,
                end++; // увеличиваем переменную end
                skip_count++; // увеличиваем количество пропусков в цикле по количеству итераций end
            } // цикл необходим для перехода к следующему слову, так как в задании не указан разделитель слов.

            start = end; // присваиваем счётчику start значение от end для пропуска не буквенных символов и продолжения работы.
        }
    }

    // сортировка пузырьком
    for (int i = 0; i < words.size(); i++){
        for (int j = 0; j < words.size() - 1; j++){
            if (words[j] > words[j + 1]){
                swap(words[j], words[j + 1]); 
            }
        }
    }
    
    // вывод результата
    cout << "\n\nResult:\n\n";
    for (int i = 0; i < words.size(); i++){
        cout << words[i] << " ";
    }

    cout << "\n\n";

    return 0; // успешное завершение программы
}