fork download
  1. import std.stdio;
  2. import std.array;
  3. import std.algorithm;
  4.  
  5. string[] input = [
  6. "a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3",
  7. "a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
  8. ];
  9.  
  10. void main()
  11. {
  12. ulong[string] g;
  13. string[] id;
  14.  
  15. foreach (ref s; input) {
  16. string[] e = s.split('=');
  17. string a = e[0];
  18. string b = e[1];
  19.  
  20. bool hasa = !!(a in g);
  21. bool hasb = !!(b in g);
  22.  
  23. if (!hasa) id ~= a;
  24. if (!hasb) id ~= b;
  25.  
  26. final switch (hasa << 1 | hasb) {
  27. case 0:
  28. g[b] = g[a] = g.length;
  29. break;
  30. case 1:
  31. g[a] = g[b];
  32. break;
  33. case 2:
  34. g[b] = g[a];
  35. break;
  36. case 3:
  37. ulong i = min(g[a], g[b]);
  38. ulong j = max(g[a], g[b]);
  39. foreach (ref x; g) if (x == j) x = i;
  40. }
  41. }
  42.  
  43. foreach (i; g.values.sort.uniq) writeln(id.filter!(x => g[x] == i));
  44. }
Success #stdin #stdout 0s 5300KB
stdin
Standard input is empty
stdout
["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"]
["c1", "c2", "c3", "c4", "d1", "d2", "d3"]
["e1", "e2", "e3"]