#!/usr/bin/perl -w
 
use strict;
 
my @AoA = (
    ['a','b','c'],
    ['a','b','c'],
    ['a','b','d'],
    ['a','b','d'],
);
 
my %combinations;
feedme(@AoA);
 
 
sub feedme {
	my %uniques;
 
	for my $ary ( @_ ) {
		my $sample = join '', @$ary;  
		if ( exists $combinations{ $sample } ) { 			++$uniques{ $combinations{ $sample } };
		} else {
			fill_combinations( @$ary );
			++$uniques{ $combinations{ $sample } };
		}
	}
 
		printf "%s found %d times\n", $_, $uniques{ $_ }; 	}
}
 
sub fill_combinations(@) {
	# Note: this function needs to be reworked for >3 elements in an array
	my $combination = join '', @_;  
	my $index = 0;
	while ( $index < @_ ) {
		my @left = split $_[$index], $combination; 		my $fw = join '', $_[$index], @left; 		$combinations{ $fw } = $combination;
		$combinations{ $rv } = $combination;
		$index++;
	}
}
 
				IyEvdXNyL2Jpbi9wZXJsIC13Cgp1c2Ugc3RyaWN0OwoKbXkgQEFvQSA9ICgKICAgIFsnYScsJ2InLCdjJ10sCiAgICBbJ2EnLCdiJywnYyddLAogICAgWydhJywnYicsJ2QnXSwKICAgIFsnYScsJ2InLCdkJ10sCiAgICBbIHF3KGEgYiBjKSBdLAogICAgWyBxdyhjIGIgYSkgXSwKICAgIFsgcXcoYiBjIGEpIF0sCiAgICBbIHF3KGEgYiBkKSBdLAopOwoKbXkgJWNvbWJpbmF0aW9uczsKZmVlZG1lKEBBb0EpOwoKCnN1YiBmZWVkbWUgewoJbXkgJXVuaXF1ZXM7CgkKCWZvciBteSAkYXJ5ICggQF8gKSB7CgkJbXkgJHNhbXBsZSA9IGpvaW4gJycsIEAkYXJ5OwoJCQoJCWlmICggZXhpc3RzICRjb21iaW5hdGlvbnN7ICRzYW1wbGUgfSApIHsKCQkJKyskdW5pcXVlc3sgJGNvbWJpbmF0aW9uc3sgJHNhbXBsZSB9IH07CgkJfSBlbHNlIHsKCQkJZmlsbF9jb21iaW5hdGlvbnMoIEAkYXJ5ICk7CgkJCSsrJHVuaXF1ZXN7ICRjb21iaW5hdGlvbnN7ICRzYW1wbGUgfSB9OwoJCX0KCX0KCQoJZm9yIChrZXlzICV1bmlxdWVzKSB7CgkJcHJpbnRmICIlcyBmb3VuZCAlZCB0aW1lc1xuIiwgJF8sICR1bmlxdWVzeyAkXyB9OwoJfQp9CgpzdWIgZmlsbF9jb21iaW5hdGlvbnMoQCkgewoJIyBOb3RlOiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld29ya2VkIGZvciA+MyBlbGVtZW50cyBpbiBhbiBhcnJheQoJbXkgJGNvbWJpbmF0aW9uID0gam9pbiAnJywgQF87CgkKCW15ICRpbmRleCA9IDA7Cgl3aGlsZSAoICRpbmRleCA8IEBfICkgewoJCW15IEBsZWZ0ID0gc3BsaXQgJF9bJGluZGV4XSwgJGNvbWJpbmF0aW9uOwoJCW15ICRmdyA9IGpvaW4gJycsICRfWyRpbmRleF0sIEBsZWZ0OwoJCW15ICRydiA9IGpvaW4gJycsICRfWyRpbmRleF0sIHNjYWxhciByZXZlcnNlIEBsZWZ0OwoJCSRjb21iaW5hdGlvbnN7ICRmdyB9ID0gJGNvbWJpbmF0aW9uOwoJCSRjb21iaW5hdGlvbnN7ICRydiB9ID0gJGNvbWJpbmF0aW9uOwoJCSRpbmRleCsrOwoJfQp9Cg==