#! perl use strict; use warnings; use Set::Tiny qw( set ); my @groups; push @groups, set(split) while ; OUTER: while (1) { for my $i (0 .. $#groups - 1) { for my $j ($i + 1 .. $#groups) { unless ($groups[$i]->is_disjoint($groups[$j])) { $groups[$i] = $groups[$i]->union($groups[$j]); splice @groups, $j, 1; next OUTER; } } } last; } print $_->as_string, "\n" for @groups; __DATA__ A C C E D C L G J K O P I M L K