use strict; use warnings; my (@first, @pos, %chain, $c, $max, $mstring); chomp($_ = ); @first = split //, $_; while () { chomp; my %hash; @_ = split //, $_; $hash{$_[$_]} = $_ for 0..$#_; push @pos, \%hash; } for $c (@first) { for (@pos) { push @{$chain{$c}}, $_->{$c}; } } $max = 0; $mstring = ''; find('', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); print $mstring; sub find { my ($s, @p) = @_; my ($end, $cp, $c) = 1; CHAR: for $cp ($p[0]..35) { my @np = ($cp+1); $c = $first[$cp]; for (0..8) { next CHAR if $chain{$c}[$_] < $p[$_+1]; $np[$_+1] = $chain{$c}[$_]; } find($s.$c, @np); $end = 0; } if ($end && length($s) > $max) { $max = length($s); $mstring = $s; } } __DATA__ CPD6Z98SB2KQNWV0F7Y1IX4GLRA5MTOJHE3U CXZOL6SUI2WTJ30HF519YPGBRNAK48MQVD7E T8COSQU6I2FJN40DKL157WVGPYXARZ3MBHE9 KNCWVZDSR5420LP91FIQGB7Y3A6J8MOUXTEH XF9C4PSDY62TWJ0QBN17IKG3OH8ALVRM5UEZ D9QCHUSN7TW2YZL0O831FGXIR6JA4P5MVBKE ZC7ISQUPK6N20OLV4T31G9FRXBAWM5YJHED8 Z3C7SJVODL25TRQ01HPWGNKXB4UA68YMI9EF BC9OXDHS2FI5Z6U0TYL1VPGQK7ANR38MEWJ4 K4TCQBHS2ZV7FXU0P8R1YGDON3A6JILM9EW5