Advertisement
PikMike

Untitled

Feb 28th, 2017
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define mp make_pair
  5. #define sz(x) (int)(x).size()
  6. #define li long long
  7. #define ld long double
  8. #define x first
  9. #define y second
  10. #define pt pair<int, int>
  11. #define pll pair<ll, ll>
  12. #define forn(i, t) for(int i = 0; i < (t); i++)
  13. #define fore(i, f, t) for(int i = (f); i < (t); i++)
  14. #define forr(i, f, t) for(int i = (f) - 1; i >= (t); i--)
  15. #define all(x) (x).begin(), (x).end()
  16. #define ins insert
  17.  
  18. using namespace std;
  19.  
  20. mt19937 myrand(time(NULL));
  21.  
  22.  
  23. const int INF = 2e9;
  24. const int MOD = 1000000007;
  25. const li INF64 = 9223372036854775807;
  26. const ld EPS = 1e-7;
  27.  
  28. const int N = 300 * 1000 + 13;
  29. const int AL = 26;
  30.  
  31. int n;
  32. int g[AL][N], h[N], s[N], z[N];
  33. vector<int> d[N];
  34. pair<pt, int> st[N];
  35. pt st1[N];
  36. int cnt, cnt1;
  37.  
  38.  
  39. bool read(){
  40.     if(scanf("%d\n", &n) != 1)
  41.         return 0;
  42.     int f, t;
  43.     char c;
  44.     memset(g, 255, sizeof(g));
  45.     forn(i, n - 1){
  46.         scanf("%d %d %c\n", &f, &t, &c);
  47.         --f, --t;
  48.         g[c - 'a'][f] = t;
  49.     }
  50.     return 1;
  51. }
  52.  
  53.  
  54. int dfs(int v, int k){
  55.     d[k].pb(v);
  56.     int cur = 1, maxn = 0;
  57.     forn(i, AL)
  58.         if (g[i][v] != -1){
  59.             int t = dfs(g[i][v], k + 1);
  60.             cur += t;
  61.             if (h[v] == -1 || maxn < t){
  62.                 h[v] = g[i][v];
  63.                 maxn = t;
  64.             }
  65.         }
  66.     s[v] = cur;
  67.     z[k] += cur;
  68.     return cur;
  69. }
  70.  
  71.  
  72. void merge(int a, int b){
  73.     if (a == b || b == -1)
  74.         return;
  75.     int siz = 1;
  76.     forn(i, 26){
  77.         if (g[i][a] != -1 && g[i][b] != -1)
  78.             merge(g[i][a], g[i][b]);
  79.         else if (g[i][a] == -1 && g[i][b] != -1){
  80.             st[cnt++] = mp(mp(i, a), g[i][a]);
  81.             g[i][a] = g[i][b];
  82.         }
  83.         siz += (g[i][a] == -1 ? 0 : s[g[i][a]]);   
  84.     }
  85.     st1[cnt1++] = mp(a, s[a]);
  86.     s[a] = siz;
  87. }
  88.  
  89.  
  90. void print(int v){
  91.     forn(i, 26)
  92.         if (g[i][v] != -1){
  93.             printf("%d %d %c\n", v + 1, g[i][v] + 1, 'a' + i);
  94.             print(g[i][v]);
  95.         }
  96. }
  97.  
  98.  
  99. void solve(){
  100.     memset(z, 0, sizeof(z));
  101.     memset(h, 255, sizeof(h));
  102.     forn(i, n)
  103.         d[i] = vector<int>();
  104.     dfs(0, 0);
  105.     cnt = 0;
  106.     cnt1 = 0;
  107.     int ans = INF, res = 0;
  108.     forn(i, n){
  109.         int tmp = 0;
  110.         for (auto v : d[i]){
  111.             int bst = h[v];
  112.             if (bst == -1)
  113.                 continue;
  114.             forn(j, AL)
  115.                 merge(bst, g[j][v]);
  116.             tmp += s[bst];
  117.            
  118.             #ifdef _DEBUG
  119.                 forn(j, n)
  120.                     forn(k, AL)
  121.                         if (g[k][j] == v){
  122.                             st[cnt++] = mp(mp(k, j), g[k][j]);
  123.                             g[k][j] = -1;
  124.                             forn(l, AL)
  125.                                 if (g[l][v] == bst){
  126.                                     st[cnt++] = mp(mp(l, j), g[l][j]);
  127.                                     g[l][j] = bst;
  128.                                     break;
  129.                                 }
  130.                             break;
  131.                         }
  132.             #endif
  133.         }
  134.        
  135.         #ifdef _DEBUG
  136.             printf("\n%d\n", i + 1);
  137.             print(0);
  138.             printf("\n");
  139.         #endif
  140.        
  141.         if (z[0] - z[i] + tmp < ans){
  142.             ans = z[0] - z[i] + tmp;
  143.             res = i + 1;
  144.         }
  145.        
  146.         forr(j, cnt, 0)
  147.             g[st[j].x.x][st[j].x.y] = st[j].y;
  148.         forr(j, cnt1, 0)
  149.             s[st1[j].x] = st1[j].y;
  150.         cnt = 0;
  151.         cnt1 = 0;
  152.     }
  153.    
  154.     printf("%d\n%d\n", ans, res);
  155. }
  156.  
  157.  
  158. int main(){
  159.     #ifdef _DEBUG
  160.         freopen("input.txt", "r", stdin);
  161.     #endif
  162.    
  163.     while(read())
  164.         solve();
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement