fork download
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int rankof[800005];
  6. int parent[800005];
  7. string ht[800005];
  8. void init(int n)
  9. {
  10. for(int i=1; i<=n; i++)
  11. { parent[i] = i; rankof[i] = 1; }
  12. }
  13.  
  14. int findnode(int x)
  15. {
  16. if(parent[x]!=x)
  17. parent[x] = findnode(parent[x]);
  18. return parent[x];
  19. }
  20.  
  21. int hash(string& s) {
  22. int h = 1;
  23. for (int i = 0; i < s.length(); i++) {
  24. h = h * 23 + s[i];
  25. h %= 600000;
  26. }
  27. while (ht[h] != "" && ht[h] != s) h++;
  28. if (ht[h] == "") ht[h] = s;
  29. return h;
  30. }
  31.  
  32.  
  33. int main()
  34. {
  35. int test;
  36. scanf("%d",&test);
  37. while(test--)
  38. {
  39. int N;
  40. scanf("%d",&N);
  41. int id = 1; string a, b;
  42. init(800000);
  43. for(int i=1; i<=N; i++)
  44. {
  45. cin >> a >> b;
  46. int u = findnode(hash(a));
  47. int v = findnode(hash(b));
  48. if(u!=v)
  49. {
  50. rankof[u] = rankof[v] + rankof[u];
  51. parent[v] = parent[u];
  52. }
  53. printf("%d\n",rankof[u]);
  54. }
  55. }
  56. return 0;
  57. }
  58.  
Success #stdin #stdout 0s 12792KB
stdin
1
3
ab bc
sd ab
cd bc
stdout
2
3
4