# 1519. Number of Nodes in the Sub-Tree With the Same Label
###### tags: `LeetCode`
## **Link**
https://leetcode.com/problems/number-of-nodes-in-the-sub-tree-with-the-same-label/
## **Code: 極限時間超大遞迴 ver. (2566 ms)**
```cpp=
class Solution {
public:
map<char,int> doit(int n, vector<int> &ans, vector<vector<int>> &child, string &labels)
{
map<char,int> mp,kp;
++mp[labels[n]];
for(int i=0;i<child[n].size();++i)
{
kp.clear();
kp = doit(child[n][i],ans,child,labels);
for(pair<char,int> v:kp)
{
mp[v.first]+=v.second;
}
}
ans[n]=mp[labels[n]];
return mp;
}
vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels)
{
vector<vector<int>> child(n); //子節點陣列
set<int> inTree; //存有在樹裡面的點
inTree.insert(0);
int chi;
sort(edges.begin(),edges.end());
for(int i=0;i<n-1;++i)
{
chi=(inTree.find(edges[i][0]) != inTree.end())?1:0; //找誰是子節點
inTree.insert(edges[i][chi]);
child[edges[i][chi^1]].push_back(edges[i][chi]);
}
vector<int> ans(n);
doit(0,ans,child,labels);
return ans;
}
};
```
## **Code: 快一點的迴圈 ver. (1292 ms)**
```cpp=
class Solution {
public:
vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels)
{
vector<int> parent(n,-1);
unordered_map<char,int> words;
unordered_set<int> inTree;
vector<bool> visited(n,false),hasChild(n,false);
inTree.insert(0);
int chi,now;
vector<int> ans(n,0);
for(int i=0;i<n-1;++i)
{
chi=(inTree.find(edges[i][0]) != inTree.end())?1:0;
parent[edges[i][chi]]=edges[i][chi^1];
hasChild[edges[i][chi^1]]=true;
inTree.insert(edges[i][chi]);
}
for(int i=0;i<n;++i)
{
if(!hasChild[i])
{
words.clear();
now=i;
while(now!=-1)
{
if(!visited[now])
{
words[labels[now]]++;
visited[now]=true;
}
ans[now]+=words[labels[now]];
now=parent[now];
}
}
}
return ans;
}
};
```
## date
**2023.01.12**
{%hackmd @nnks8908/background_leetcode %}