#include <iostream>
#include <strstream>
#include <fstream>
#include <cctype>
#include <cstring>
#include <malloc.h>
#define BLOCK 64
//Пузырьковая сортировка
template<typename T>
void bsort(T* f, T* l){
bool lp = true;
T* e = l - 1;
for(; (f != l) && lp; ++f){
lp = false;
for(T* p = e; p > f; --p){
if(*p < *(p - 1)){
std::swap(*p, *(p - 1));
lp = true;
}
}
}
}
//структура содержит указатель на слово, длинну, кол-во гласных
struct info {
const char* p;
unsigned short n, v;
bool operator < (const info& inf) const {
return (v < inf.v);
}
static bool _alloc(info** arr, size_t n, size_t& m){
if(*arr == NULL){
*arr = (info*)malloc(BLOCK * sizeof(info));
if(*arr != NULL)
m = BLOCK;
} else if(n >= m){
info* p = (info*)realloc(*arr, (m + BLOCK) * sizeof(info));
if(p == NULL)
return false;
m = m + BLOCK;
*arr = p;
}
return (*arr != NULL);
}
};
void output_ws(std::ostream& _out, std::istream& _in){
char buf[256];
std::string s;
//читаем входной поток в строку
while(! _in.eof() && ! _in.fail()){
_in.read(buf, sizeof(buf)-1);
if(_in.gcount() > 0)
s.append(buf, buf + _in.gcount());
}
size_t cnt = 0, mem = 0;
info* arr = NULL;
unsigned short v, n;
const char* i, *p = s.c_str();
while(*p){
while(*p && ! std::isalpha(*p))
++p;
i = p;
n = v = 0;
while(std::isalpha(*i)){
if(std::strchr("aeiouyAEIOUY", *i) != NULL)
++v;
++i;
++n;
}
if(n > 0){
if(info::_alloc(&arr, cnt, mem)){
arr[cnt].p = p;
arr[cnt].n = n;
arr[cnt].v = v;
++cnt;
}
}
p = i;
}
//сортируем
bsort(arr, arr + cnt);
//выводим
const info* end = arr + cnt;
for(const info* it = arr; it != end; ++it){
_out.write(it->p, (int)it->n);
_out << std::endl;
}
free(arr);
}
int main(void){
char s[] = "information found\n no matching symbolic";
std::istrstream sp(s);
output_ws(std::cout, sp);
/* вывести из файла
std::ifstream fp("input.txt");
output_ws(std::cout, fp);
fp.close();
*/
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3Ryc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPGNjdHlwZT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxtYWxsb2MuaD4KI2RlZmluZSAgQkxPQ0sgICA2NAoKCi8v0J/Rg9C30YvRgNGM0LrQvtCy0LDRjyDRgdC+0YDRgtC40YDQvtCy0LrQsAp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGJzb3J0KFQqIGYsIFQqIGwpewoJYm9vbCBscCA9IHRydWU7CglUKiAgIGUgID0gbCAtIDE7CgoJZm9yKDsgKGYgIT0gbCkgJiYgbHA7ICsrZil7CgkJbHAgPSBmYWxzZTsKCQlmb3IoVCogcCA9IGU7IHAgPiBmOyAtLXApewoJCQlpZigqcCA8ICoocCAtIDEpKXsKCQkJCXN0ZDo6c3dhcCgqcCwgKihwIC0gMSkpOwoJCQkJbHAgPSB0cnVlOwoJCQl9CgkJfQoJfQp9CgoKLy/RgdGC0YDRg9C60YLRg9GA0LAg0YHQvtC00LXRgNC20LjRgiDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDRgdC70L7QstC+LCDQtNC70LjQvdC90YMsINC60L7Quy3QstC+INCz0LvQsNGB0L3Ri9GFCnN0cnVjdCBpbmZvIHsKCWNvbnN0IGNoYXIqICAgIHA7Cgl1bnNpZ25lZCBzaG9ydCBuLCB2OwoKCWJvb2wgb3BlcmF0b3IgPCAoY29uc3QgaW5mbyYgaW5mKSBjb25zdCB7CgkJcmV0dXJuICh2IDwgaW5mLnYpOwoJfQoKCXN0YXRpYyBib29sIF9hbGxvYyhpbmZvKiogYXJyLCBzaXplX3Qgbiwgc2l6ZV90JiBtKXsKCQlpZigqYXJyID09IE5VTEwpewoJCQkqYXJyID0gKGluZm8qKW1hbGxvYyhCTE9DSyAqIHNpemVvZihpbmZvKSk7CgkJCWlmKCphcnIgIT0gTlVMTCkKCQkJCW0gPSBCTE9DSzsKCQl9IGVsc2UgaWYobiA+PSBtKXsKCQkJaW5mbyogcCA9IChpbmZvKilyZWFsbG9jKCphcnIsIChtICsgQkxPQ0spICogc2l6ZW9mKGluZm8pKTsKCQkJaWYocCA9PSBOVUxMKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQltICAgID0gbSArIEJMT0NLOwoJCQkqYXJyID0gcDsKCQl9CgkJcmV0dXJuICgqYXJyICE9IE5VTEwpOwoJfQp9OwoKCnZvaWQgb3V0cHV0X3dzKHN0ZDo6b3N0cmVhbSYgX291dCwgc3RkOjppc3RyZWFtJiBfaW4pewoJY2hhciBidWZbMjU2XTsKCXN0ZDo6c3RyaW5nIHM7CgoJLy/Rh9C40YLQsNC10Lwg0LLRhdC+0LTQvdC+0Lkg0L/QvtGC0L7QuiDQsiDRgdGC0YDQvtC60YMKCXdoaWxlKCEgX2luLmVvZigpICYmICEgX2luLmZhaWwoKSl7CgkJX2luLnJlYWQoYnVmLCBzaXplb2YoYnVmKS0xKTsKCQlpZihfaW4uZ2NvdW50KCkgPiAwKQoJCQlzLmFwcGVuZChidWYsIGJ1ZiArIF9pbi5nY291bnQoKSk7Cgl9CgoJc2l6ZV90IGNudCA9IDAsIG1lbSA9IDA7CglpbmZvKiAgYXJyID0gTlVMTDsKCgl1bnNpZ25lZCBzaG9ydCB2LCBuOwoJY29uc3QgY2hhciogaSwgKnAgPSBzLmNfc3RyKCk7CgoJd2hpbGUoKnApewoJCXdoaWxlKCpwICYmICEgc3RkOjppc2FscGhhKCpwKSkKCQkJKytwOwoKCQlpID0gcDsKCQluID0gdiA9IDA7CgkJd2hpbGUoc3RkOjppc2FscGhhKCppKSl7CgkJCWlmKHN0ZDo6c3RyY2hyKCJhZWlvdXlBRUlPVVkiLCAqaSkgIT0gTlVMTCkKCQkJCSsrdjsKCQkJKytpOwoJCQkrK247CgkJfQoKCQlpZihuID4gMCl7CgkJCWlmKGluZm86Ol9hbGxvYygmYXJyLCBjbnQsIG1lbSkpewoJCQkJYXJyW2NudF0ucCA9IHA7CgkJCQlhcnJbY250XS5uID0gbjsKCQkJCWFycltjbnRdLnYgPSB2OwoJCQkJKytjbnQ7CgkJCX0KCQl9CgkJcCA9IGk7Cgl9CgoJLy/RgdC+0YDRgtC40YDRg9C10LwKCWJzb3J0KGFyciwgYXJyICsgY250KTsKCgkvL9Cy0YvQstC+0LTQuNC8Cgljb25zdCBpbmZvKiBlbmQgPSBhcnIgKyBjbnQ7Cglmb3IoY29uc3QgaW5mbyogaXQgPSBhcnI7IGl0ICE9IGVuZDsgKytpdCl7CgkJX291dC53cml0ZShpdC0+cCwgKGludClpdC0+bik7CgkJX291dCA8PCBzdGQ6OmVuZGw7Cgl9CglmcmVlKGFycik7Cn0KCgppbnQgbWFpbih2b2lkKXsKCWNoYXIgc1tdID0gImluZm9ybWF0aW9uIGZvdW5kXG4gbm8gbWF0Y2hpbmcgc3ltYm9saWMiOwoJc3RkOjppc3Ryc3RyZWFtIHNwKHMpOwoJb3V0cHV0X3dzKHN0ZDo6Y291dCwgc3ApOwoKLyogINCy0YvQstC10YHRgtC4INC40Lcg0YTQsNC50LvQsAoJc3RkOjppZnN0cmVhbSBmcCgiaW5wdXQudHh0Iik7CglvdXRwdXRfd3Moc3RkOjpjb3V0LCBmcCk7CglmcC5jbG9zZSgpOwoqLwoJcmV0dXJuIDA7Cn0K