#include <iostream>
#include <list>
#include <string>
#include <locale> // std::locale, std::tolower
#include <algorithm>
class Node
{
public:
Node(std::string name, std::list<Node> children = {})
{
name_ = name;
children_=children;
};
static int cToLower(int c) {
return tolower(c);
}
int count_nodes_containing_string(std::string needle)
{
int count = 0;
//TODO implement me, needs to be case-insensitive
for ( Node nthChild : children_ )
{
//more children exist
count += nthChild.count_nodes_containing_string(needle);
}
//no more child
std::string name_low = name_;
std::transform(name_low.begin(), name_low.end(), name_low.begin(), ::tolower);
std::transform(needle.begin(), needle.end(), needle.begin(), ::tolower);
if (name_low.find(needle) != std::string::npos )
{
return count+1;
}
else
{
return count;
}
//needle; //TODO use the parameter
//return -1;
}
private:
std::string name_;
std::list<Node> children_;
};
#ifndef RunTests
int main()
{
//Create an example tree
Node n("root",{
{"MagaZino",{
{"I"},
{"Love"},
{"magazino"}
}},
{"Hello",{
{"Hello",{
{"Hello",{
{"World"}
}}
}}
}}
});
//Cout the solution
std::cout << n.count_nodes_containing_string("test")<<std::endl;
}
#endif
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGxvY2FsZT4gICAgICAgICAvLyBzdGQ6OmxvY2FsZSwgc3RkOjp0b2xvd2VyCiNpbmNsdWRlIDxhbGdvcml0aG0+CgoKY2xhc3MgTm9kZQp7CiAgcHVibGljOgogICAgTm9kZShzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6Omxpc3Q8Tm9kZT4gY2hpbGRyZW4gPSB7fSkKICAgIHsKICAgICAgICBuYW1lXyA9IG5hbWU7CiAgICAgICAgY2hpbGRyZW5fPWNoaWxkcmVuOwogICAgfTsKICAgIAogICAgc3RhdGljIGludCBjVG9Mb3dlcihpbnQgYykgewogICAgICAgIHJldHVybiB0b2xvd2VyKGMpOwogICAgfQogICAgCgoKICAgIGludCBjb3VudF9ub2Rlc19jb250YWluaW5nX3N0cmluZyhzdGQ6OnN0cmluZyBuZWVkbGUpCiAgICB7CiAgICAJaW50IGNvdW50ID0gMDsKICAgICAgICAvL1RPRE8gaW1wbGVtZW50IG1lLCBuZWVkcyB0byBiZSBjYXNlLWluc2Vuc2l0aXZlCiAgICAgICAgZm9yICggTm9kZSBudGhDaGlsZCA6IGNoaWxkcmVuXyAgKQogICAgICAgIHsKICAgICAgICAJLy9tb3JlIGNoaWxkcmVuIGV4aXN0CiAgICAgICAgCWNvdW50ICs9IG50aENoaWxkLmNvdW50X25vZGVzX2NvbnRhaW5pbmdfc3RyaW5nKG5lZWRsZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIAkvL25vIG1vcmUgY2hpbGQKICAgICAgICAJc3RkOjpzdHJpbmcgbmFtZV9sb3cgPSAgbmFtZV87CiAgICAgICAgCXN0ZDo6dHJhbnNmb3JtKG5hbWVfbG93LmJlZ2luKCksIG5hbWVfbG93LmVuZCgpLCBuYW1lX2xvdy5iZWdpbigpLCA6OnRvbG93ZXIpOwogICAgICAgIAlzdGQ6OnRyYW5zZm9ybShuZWVkbGUuYmVnaW4oKSwgbmVlZGxlLmVuZCgpLCBuZWVkbGUuYmVnaW4oKSwgOjp0b2xvd2VyKTsKICAgICAgICAJaWYgKG5hbWVfbG93LmZpbmQobmVlZGxlKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAgKQogICAgICAgIAl7CiAgICAgICAgCQlyZXR1cm4gY291bnQrMTsKICAgICAgICAJfQogICAgICAgIAllbHNlCiAgICAgICAgCXsKICAgICAgICAJCXJldHVybiBjb3VudDsKICAgICAgICAJfQogICAgICAgIAogICAgICAgIAogICAgICAgIC8vbmVlZGxlOyAvL1RPRE8gdXNlIHRoZSBwYXJhbWV0ZXIKICAgICAgICAvL3JldHVybiAtMTsKICAgIH0KcHJpdmF0ZToKICAgIHN0ZDo6c3RyaW5nIG5hbWVfOwogICAgc3RkOjpsaXN0PE5vZGU+IGNoaWxkcmVuXzsKfTsKCiNpZm5kZWYgUnVuVGVzdHMKaW50IG1haW4oKQp7CiAgICAvL0NyZWF0ZSBhbiBleGFtcGxlIHRyZWUKICAgIE5vZGUgbigicm9vdCIsewogICAgICAgIHsiTWFnYVppbm8iLHsKICAgICAgICAgICAgeyJJIn0sCiAgICAgICAgICAgIHsiTG92ZSJ9LAogICAgICAgICAgICB7Im1hZ2F6aW5vIn0KICAgICAgICAgICAgfX0sCiAgICAgICAgeyJIZWxsbyIsewogICAgICAgICAgICB7IkhlbGxvIix7CiAgICAgICAgICAgICAgICB7IkhlbGxvIix7CiAgICAgICAgICAgICAgICAgICAgeyJXb3JsZCJ9CiAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICB9fQogICAgICAgIH19CiAgICB9KTsKICAgIC8vQ291dCB0aGUgc29sdXRpb24KICAgIHN0ZDo6Y291dCA8PCBuLmNvdW50X25vZGVzX2NvbnRhaW5pbmdfc3RyaW5nKCJ0ZXN0Iik8PHN0ZDo6ZW5kbDsKfQojZW5kaWY=