Любые замечания выслушаю с удовольствием)
1) Вам не нужны все эти заголовочные файлы. Первый из них вообще непонятно что и зачем. Пока не убрал, не компилировалось.
2) Признаюсь, меня запутал ваш вектор указателей, каждый их которых выделяется как динамический массив. Как-то оно странно. В C++ есть строки. Которые ведут себя как строки. Почему их не использовать?
3) В продолжение прошлому замечанию. Приведённый код -- достаточно странное сочетание c и c++. Как правило, лучше определиться и следовать стилистике одного из языков.
Можно конкретнее, но как ни пытался указать на конкретную проблему, она сводилась к тому что мешается c и c++. То есть, вроде всё правильно, но так лучше не делать.
Ну вот, например. gets и cout. Уж или gets+puts или cin+cout. Не говоря о том, что
Многие источники советуют программистам никогда не использовать gets в новых программах.
Применение gets весьма осуждается. Функция оставлена в стандартах C89 и C99 для обратной совместимости. Множество инструментов разработки ПО, как например, GNU ld выдает предупреждения в случае обнаружения при компоновке кода с использованием gets.