Guest User

Untitled

a guest
Jul 18th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.84 KB | None | 0 0
  1. class DistinctSets
  2.  
  3. class Node
  4. attr_reader :name, :merged
  5.  
  6. def initialize(name)
  7. @name = name
  8. @neighbours = {}
  9. @merged = false
  10. end
  11.  
  12. def meet_and_greet(nodes)
  13. for node in nodes
  14. name = node.name
  15. @neighbours[name] = node unless @name == name
  16. end
  17. end
  18.  
  19. def merge_names(names)
  20. @merged = true
  21. mynames = @neighbours.keys
  22. union = names << @name | mynames
  23. for n in (mynames - names)
  24. node = @neighbours[n]
  25. union = node.merge_names(union) unless node.merged
  26. end
  27. union
  28. end
  29. end
  30.  
  31. def initialize(sets)
  32. @sets = sets
  33. @distinct = nil
  34. end
  35.  
  36. def distinct
  37. if @distinct.nil?
  38. graph = {}
  39. @distinct = []
  40. for s in @sets
  41. if s.empty?
  42. # Compatibility with posted test cases
  43. @distinct |= [[]]
  44. else
  45. sn = s.map {|n| graph[n] ||= Node.new(n)}
  46. for s1 in sn
  47. s1.meet_and_greet(sn)
  48. end
  49. end
  50. end
  51. nodes = graph.values
  52. while (node = nodes.pop)
  53. next if node.merged
  54. set = node.merge_names([])
  55. @distinct << set.sort do |a, b|
  56. if a.kind_of?(Numeric) and b.kind_of?(Numeric)
  57. a <=> b
  58. else
  59. a.to_s <=> b.to_s
  60. end
  61. end
  62. end
  63. end
  64. return @distinct
  65. end
  66.  
  67. end
  68.  
  69.  
  70. def distinct_sets(sets)
  71. DistinctSets.new(sets).distinct
  72. end
Add Comment
Please, Sign In to add comment