sub MaxOrderedSubList {
my @order= @{ shift @_ };
my %order;
@order{@order}= 0..$#order;
my @list= @{ shift @_ };
my @wins= ( [] );
my @idx= ( -1 );
my $i= 0;
while( 1 ) {
do {
++$idx[$i];
if( $#list < $idx[$i] ) {
if( --$i < 0 ) {
return @wins;
}
redo;
}
} while( 0 < $i
&& $order{$list[$idx[$i]]}
<= $order{$list[$idx[$i-1]]} );
if( $#{$wins[0]} <= $i ) {
@wins= () if $#{$wins[0]} < $i;
push @wins, [ @list[@idx[0..$i]] ];
}
$idx[$i+1]= $idx[$i];
++$i;
}
}
for my $win ( MaxOrderedSubList(
[1,2,3,8,4,5,6], [2,1,3,5,4] )
) {
print "@$win\n";
}
for my $win ( MaxOrderedSubList(
[qw( t h i s w o r k a )], [qw( w h a t i s o k )] )
) {
print "@$win\n";
}
####
2 3 5
2 3 4
1 3 5
1 3 4
h i s o k
t i s o k
####
0 + @{( MaxOrderedSubList( [...], [...] ) )[0]}