func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100100;   const long long MOD = 100030001, H = 47;   map<int, long long> d[N];   vector<int> adj[N];   set<pair<long long, int> > s;   vector<pair<int, pair<long long, int> > > nei[N];   long long r[N], l[N], num[N], ch[N], h[3 * N], n, sz, ans, o = 10, c = 11;   void add(int ind, int val) {     auto it = s.lower_bound({ind, val});     if (it == s.end() || it->first != ind)       s.insert({ind, val});     else {       if (it->second + val != 0) s.insert({ind, it->second + val});       s.erase(it);     }     return;   }   void f(int v, int u) {     add(d[v][v], -1);     add(d[u][u], 1);     add(d[v][u], 1);     add(d[u][v], -1);     return;   }   void DFS1(int v, int par = 0) {     for (int u : adj[v]) {       if (u != par) {         DFS1(u, v);         ch[v] += ch[u];         nei[v].push_back({d[u][v], {ch[u], u}});       }     }     ch[v]++;     long long ans = o;     sort(nei[v].begin(), nei[v].end());     for (auto u : nei[v]) {       ans = ans * h[2 * u.second.first] % MOD;       ans = (ans + u.first) % MOD;     }     d[v][par] = (ans * H + c) % MOD;     return;   }   void DFS2(int v, int par = 0) {     nei[v].clear();     for (int u : adj[v]) {       nei[v].push_back({d[u][v], {ch[u], u}});       if (u == par) nei[v].back().second.first = n - ch[v];     }     sort(nei[v].begin(), nei[v].end());     l[0] = o, r[nei[v].size() + 1] = c, num[nei[v].size() + 1] = 1;     for (int i = 1; i <= nei[v].size(); i++) {       auto u = nei[v][i - 1];       l[i] = (l[i - 1] * h[u.second.first * 2] + d[u.second.second][v]) % MOD;     }     for (int i = nei[v].size(); i > 0; i--) {       auto u = nei[v][i - 1];       num[i] = num[i + 1] + u.second.first * 2;       r[i] = (r[i + 1] + d[u.second.second][v] * h[num[i + 1]]) % MOD;     }     for (int i = 0; i < nei[v].size(); i++) {       d[v][nei[v][i].second.second] = (l[i] * h[num[i + 2]] + r[i + 2]) % MOD;     }     for (int u : adj[v])       if (u != par) DFS2(u, v);     add(d[v][par], 1);     return;   }   void DFS3(int v, int par = 0) {     if (s.size() > sz) {       ans = v;       sz = s.size();     }     for (int u : adj[v]) {       if (u != par) {         f(v, u);         DFS3(u, v);       }     }     f(v, par);     return;   }   int main() {     ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);     int u, v;     cin >> n;     h[0] = 1;     for (int i = 0; i <= n * 2 + 10; i++) h[i + 1] = h[i] * H % MOD;     for (int i = 1; i < n; i++) {       cin >> u >> v;       adj[--u].push_back(--v);       adj[v].push_back(u);     }     if (n == 1) {       cout << 1 << endl;       return 0;     }     DFS1(0);     DFS2(0);     DFS3(0);     cout << ans + 1 << endl;     return 0;   }   