#include <iostream>
#include <string>
#include <vector>
std::vector<size_t> CountSymbolsAppearing(const std::string &text) {
std::vector<size_t> symbols_appearing(256, 0);
for (auto symbol : text) {
++symbols_appearing[symbol];
}
return symbols_appearing;
}
char SymbolFromIndex(size_t symbol_index) {
return static_cast<char>(symbol_index);
}
void ShowSymbolAppearingInfo(char symbol, size_t number_of_appears) {
if (number_of_appears != 0) {
std::cout << "[" << symbol << " ] = " << number_of_appears << '\n';
}
}
void ShowText(const std::string &text) {
std::cout << "text: " << text << '\n';
}
void ShowSymbolsAppearing(const std::vector<size_t> &symbols_appearing) {
for (size_t symbol_index = 0; symbol_index < symbols_appearing.size();
++symbol_index) {
ShowSymbolAppearingInfo(SymbolFromIndex(symbol_index),
symbols_appearing.at(symbol_index));
}
}
int main() {
std::string text = "this is test string";
ShowText(text);
ShowSymbolsAppearing(CountSymbolsAppearing(text));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgpzdGQ6OnZlY3RvcjxzaXplX3Q+IENvdW50U3ltYm9sc0FwcGVhcmluZyhjb25zdCBzdGQ6OnN0cmluZyAmdGV4dCkgewogIHN0ZDo6dmVjdG9yPHNpemVfdD4gc3ltYm9sc19hcHBlYXJpbmcoMjU2LCAwKTsKICBmb3IgKGF1dG8gc3ltYm9sIDogdGV4dCkgewogICAgKytzeW1ib2xzX2FwcGVhcmluZ1tzeW1ib2xdOwogIH0KICByZXR1cm4gc3ltYm9sc19hcHBlYXJpbmc7Cn0KCmNoYXIgU3ltYm9sRnJvbUluZGV4KHNpemVfdCBzeW1ib2xfaW5kZXgpIHsKICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oc3ltYm9sX2luZGV4KTsKfQoKdm9pZCBTaG93U3ltYm9sQXBwZWFyaW5nSW5mbyhjaGFyIHN5bWJvbCwgc2l6ZV90IG51bWJlcl9vZl9hcHBlYXJzKSB7CiAgaWYgKG51bWJlcl9vZl9hcHBlYXJzICE9IDApIHsKICAgIHN0ZDo6Y291dCA8PCAiWyIgPDwgc3ltYm9sIDw8ICIgXSA9ICIgPDwgbnVtYmVyX29mX2FwcGVhcnMgPDwgJ1xuJzsKICB9Cn0KCnZvaWQgU2hvd1RleHQoY29uc3Qgc3RkOjpzdHJpbmcgJnRleHQpIHsKICBzdGQ6OmNvdXQgPDwgInRleHQ6ICIgPDwgdGV4dCA8PCAnXG4nOwp9Cgp2b2lkIFNob3dTeW1ib2xzQXBwZWFyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnN5bWJvbHNfYXBwZWFyaW5nKSB7CiAgZm9yIChzaXplX3Qgc3ltYm9sX2luZGV4ID0gMDsgc3ltYm9sX2luZGV4IDwgc3ltYm9sc19hcHBlYXJpbmcuc2l6ZSgpOwogICAgICAgKytzeW1ib2xfaW5kZXgpIHsKICAgIFNob3dTeW1ib2xBcHBlYXJpbmdJbmZvKFN5bWJvbEZyb21JbmRleChzeW1ib2xfaW5kZXgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sc19hcHBlYXJpbmcuYXQoc3ltYm9sX2luZGV4KSk7CiAgfQp9CgppbnQgbWFpbigpIHsKICBzdGQ6OnN0cmluZyB0ZXh0ID0gInRoaXMgaXMgdGVzdCBzdHJpbmciOwogIFNob3dUZXh0KHRleHQpOwogIFNob3dTeW1ib2xzQXBwZWFyaW5nKENvdW50U3ltYm9sc0FwcGVhcmluZyh0ZXh0KSk7Cn0K