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

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

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

    // ввод строк
    cout << "Input stroke: ";
    getline(cin, str);
    if (str[str.size() - 1] != ' '){ // если в конце строки нет пробела
        str.push_back(' '); // добавляем для корректной работы кода-разделителя
    }

    // проверка на пустоту строки
	if (str.empty()){ // если строка пуста, то
		cout << "String can't be empty" << endl; // вывод сообщения об ошибке
		return 0; // завершение программы
	}
	else { // иначе проверка на пробелы
		for (int i = 0; i < str.size(); i++){ // цикл на всю строку
			if (str[i] == ' '){ // если символ является пробелом, то
				space++; // увеличиваем счётчик
			}
		}
		if (space == str.size()) { // если количество пробелов равно размеру строки, то
			cout << "String have only spaces." << endl; // вывод сообщения об ошибке
			return 0; // завершение программы
		}
	}
    // обнуляем счётчики
    start = end = 0;
    skip_count = 0;
    for (int i = 0; i < str.size(); i++) { // цикл на прохождение строки
        if (skip_count > 0){ // если есть ряд символов без букв
            skip_count--; // уменьшаем счётчик пропусков
            continue; // переходим на следующую итерацию до следующей буквы в строке
        }
        if (isalpha(str[i]) == false){ // если текущий символ строки не является буквой, то
            skip_count = 0; // обнуляем счётчик от нового слова
            end = i; // счётчик окончания равен текущему значению i
            words.push_back(str.substr(start, (end-start))); // добавляем в массив слов часть строки от значения счётчика start. 
            // (end - start) нужен для вычисления количества символов

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

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

    // цикл для сортировки массива методом пузырька
    for (int i = 0; i < words.size(); i++){
        if (words[i].empty()){
            continue;
        }
        for (int j = 0; j < words.size() - 1; j++){ 
            if (words[j] > words[j + 1]){ // если элемент справа меньше текущего, то
                swap(words[j], words[j + 1]); // меняем их местами
            }
        }
    }

    cout << "Sorted stroke: ";

    // вывод отсортированного массива со словами
    for (int i = 0; i < words.size(); i++){
        cout << words[i] << " ";
    }

    cout << endl;

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