A website domain “discuss.leetcode.com” consists of various subdomains. At the top level, we have “com”, at the next level, we have “leetcode.com” and at the lowest level, “discuss.leetcode.com”. When we visit a domain like “discuss.leetcode.com”, we will also visit the parent domains “leetcode.com” and “com” implicitly.
A count-paired domain is a domain that has one of the two formats “rep d1.d2.d3” or “rep d1.d2” where rep is the number of visits to the domain and d1.d2.d3 is the domain itself.
- For example, “9001 discuss.leetcode.com” is a count-paired domain that indicates that discuss.leetcode.com was visited 9001 times.
Given an array of count-paired domains cpdomains, return an array of the count-paired domains of each subdomain in the input. You may return the answer in any order.
struct Domain {
int visit;
string domain;
vector<int> pos;
};
class Solution {
unordered_map<string, int> counts;
Domain parse(string& s) {
string v, domain, tmp;
vector<int> pos{0};
stringstream ss(s);
getline(ss, v, ' ');
while(getline(ss, tmp, '.')) {
domain += tmp + '.';
pos.push_back(domain.length());
}
domain.pop_back();
pos.pop_back();
return Domain {.visit = atoi(v.c_str()), .domain = domain, .pos = pos};
}
public:
vector<string> subdomainVisits(vector<string>& cpdomains) {
vector<string> res;
for(auto& cpdomain: cpdomains) {
Domain d = parse(cpdomain);
for(auto& p : d.pos) {
counts[&d.domain[p]] += d.visit;
}
}
transform(counts.begin(), counts.end(), back_inserter(res), [] (pair<const string, int>& p) {
return to_string(p.second) + ' ' + p.first;
});
return res;
}
};