#include <iostream> // this doesn't count for the 'no library' limitation?
struct letter_count
{
char letter = '\0';
int count = 0;
};
int add(letter_count *begin, letter_count *end, char letter)
{
while (begin != end)
{
if (begin->letter == letter)
{
return ++begin->count;
}
else if (begin->letter == '\0')
{
++begin->letter = letter;
return ++begin->count;
}
++begin;
}
return 0;
}
int max (int a, int b)
{
return a > b ? a : b;
}
letter_count *buffer = nullptr;
int main()
{
auto testString = "supergalifragilisticoespialidoso";
int len = 0, index = 0, greater = 0;
while (testString[index++])
++len;
buffer = new letter_count[len];
for (index = 0; index < len; ++index)
greater = max(add(buffer, buffer + len, testString[index]), greater);
for (index = 0; buffer[index].letter && index < len; ++index)
std::cout << buffer[index].letter;
std::cout << '\n';
for (int count = 0; count < greater; ++count)
{
for (index = 0; buffer[index].letter && index < len; ++index)
std::cout << (count < buffer[index].count ? '*' : ' ');
std::cout << '\n';
}
delete [] buffer;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAvLyB0aGlzIGRvZXNuJ3QgY291bnQgZm9yIHRoZSAnbm8gbGlicmFyeScgbGltaXRhdGlvbj8KCnN0cnVjdCBsZXR0ZXJfY291bnQKewoJY2hhciBsZXR0ZXIgPSAnXDAnOwoJaW50IGNvdW50ID0gMDsKfTsKCmludCBhZGQobGV0dGVyX2NvdW50ICpiZWdpbiwgbGV0dGVyX2NvdW50ICplbmQsIGNoYXIgbGV0dGVyKQp7Cgl3aGlsZSAoYmVnaW4gIT0gZW5kKQoJewoJCWlmIChiZWdpbi0+bGV0dGVyID09IGxldHRlcikKCQl7CgkJCXJldHVybiArK2JlZ2luLT5jb3VudDsKCQl9CgkJZWxzZSBpZiAoYmVnaW4tPmxldHRlciA9PSAnXDAnKQoJCXsKCQkJKytiZWdpbi0+bGV0dGVyID0gbGV0dGVyOwoJCQlyZXR1cm4gKytiZWdpbi0+Y291bnQ7CgkJfQoKCQkrK2JlZ2luOwoJfQoKCXJldHVybiAwOwp9CgppbnQgbWF4IChpbnQgYSwgaW50IGIpCnsKCXJldHVybiBhID4gYiA/IGEgOiBiOwp9CgpsZXR0ZXJfY291bnQgKmJ1ZmZlciA9IG51bGxwdHI7CgppbnQgbWFpbigpCnsKCWF1dG8gdGVzdFN0cmluZyA9ICJzdXBlcmdhbGlmcmFnaWxpc3RpY29lc3BpYWxpZG9zbyI7CgoJaW50IGxlbiA9IDAsIGluZGV4ID0gMCwgZ3JlYXRlciA9IDA7CgoJd2hpbGUgKHRlc3RTdHJpbmdbaW5kZXgrK10pCgkJKytsZW47CgoJYnVmZmVyID0gbmV3IGxldHRlcl9jb3VudFtsZW5dOwoKCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgKytpbmRleCkKCQlncmVhdGVyID0gbWF4KGFkZChidWZmZXIsIGJ1ZmZlciArIGxlbiwgdGVzdFN0cmluZ1tpbmRleF0pLCBncmVhdGVyKTsKCglmb3IgKGluZGV4ID0gMDsgYnVmZmVyW2luZGV4XS5sZXR0ZXIgJiYgaW5kZXggPCBsZW47ICsraW5kZXgpCgkJc3RkOjpjb3V0IDw8IGJ1ZmZlcltpbmRleF0ubGV0dGVyOwoKCXN0ZDo6Y291dCA8PCAnXG4nOwoKCWZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBncmVhdGVyOyArK2NvdW50KQoJewoJCWZvciAoaW5kZXggPSAwOyBidWZmZXJbaW5kZXhdLmxldHRlciAmJiBpbmRleCA8IGxlbjsgKytpbmRleCkKCQkJc3RkOjpjb3V0IDw8IChjb3VudCA8IGJ1ZmZlcltpbmRleF0uY291bnQgPyAnKicgOiAnICcpOwoKCQlzdGQ6OmNvdXQgPDwgJ1xuJzsKCX0KCglkZWxldGUgW10gYnVmZmVyOwoKCXJldHVybiAwOwp9