use Modern::Perl; my %uniq_substrings; my $strings = ; for ( 1 .. $strings ) { my $string = ; $uniq_substrings{$_}++ for substrings($string); } my $queries = ; for ( 1 .. $queries ) { my $query = ; say +( ( $query > scalar( keys %uniq_substrings ) ) ? 'INVALID' : ( sort keys %uniq_substrings )[ $query - 1 ] ); } sub substrings { my $string = shift; chomp($string); my @substrings; my $maxlength = length $string; for my $start ( 0 .. $maxlength ) { for my $length ( 1 .. $maxlength - $start ) { push @substrings, substr $string, $start, $length; } } return @substrings; } __DATA__ 2 aab aac 3 3 8 23