/* $Id$ */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

static int add(char **dst, size_t *dstsz, const char *src, size_t srcsz)
{
	char *p = (char *) realloc(*dst, *dstsz + srcsz);
	if (!p)
	{
		free(*dst);
		fprintf(stderr, "Memory exhausted (p=%p sz=%d)\n", *dst, *dstsz + srcsz);
		return -1;
	}

	*dst = p;
	memcpy(*dst + *dstsz, src, srcsz);
	*dstsz += srcsz;

	return 0;
}

static char *read_data(void)
{
	char *ptr = NULL;
	size_t sz = 0;

	for (;;)
	{
		char buf[1024];

		fgets(buf, sizeof(buf), stdin);
		if (feof(stdin))
			break;

		if (add(&ptr, &sz, buf, strlen(buf)) == -1)
			return NULL;
	}

	if (add(&ptr, &sz, "", 1) == -1)
		return NULL;

	return ptr;
}

static int is_vowel(char ch)
{
	static const char vowels[] = "aeiouy";
	return strchr(vowels, ch) ? 1 : 0;
}

static char unrot_char_one(char ch)
{
	char ch2 = tolower(ch);

	if (ch2 >= 'a' && ch2 < 'z')
		return ch + 1;
	else if (ch2 == 'z')
		return ch - ('z' - 'a');

	return ch;
}

static char unrot_char(char ch, size_t rot, int dump)
{
	size_t i;

	for (i = 0; i < rot; ++i)
		ch = unrot_char_one(ch);

	if (dump)
		fputc(ch, stdout);

	return ch;
}

static size_t unrot_one(const char *data, size_t rot, int dump)
{
	size_t count = 0;

	if (dump)
		fprintf(stderr, "shift=%d\n", rot);

	while (*data)
	{
		char ch = unrot_char(*data++, rot, dump);

		if (is_vowel(ch))
			++count;
	}

	return count;
}

static void unrot_all(const char *data)
{
	size_t vowels_max = 0;
	size_t rot, rot_max = 0;

	for (rot = 0; rot < 26; ++rot)
	{
		size_t vowels = unrot_one(data, rot, 0);
		if (vowels > vowels_max)
		{
			vowels_max = vowels;
			rot_max = rot;
		}
	}

	unrot_one(data, rot_max, 1);
}

static void free_data(char *data)
{
	free(data);
}

int main(int ac, char * const av[])
{
	char *data;

	if (!(data = read_data()))
		return EXIT_FAILURE;

	unrot_all(data);
	free_data(data);

	return EXIT_SUCCESS;
}
