6 use constant { WORD => 0, LEN => 1, UP => 2, DOWN => 3, RIGHT => 4 };
11 $WORD{$_} = [$_, 1, undef, undef, undef];
14 my $MAX = 0; my @WINNERS;
15 WORD: while (my ($word, $node) = each %WORD) {
16 my $len = length $word;
17 next WORD unless $len >= 2;
18 my $parent = $WORD{substr $word, 0, $len - 1};
19 next WORD unless defined $parent;
20 $node->[UP] = $parent;
21 my $nlen = $node->[LEN];
23 unless (defined $parent) {
25 if ($nlen > $MAX) { $MAX = $nlen; @WINNERS = (); }
30 my $plen = $parent->[LEN]; $nlen++;
33 elsif ($plen == $nlen)
34 { $node->[RIGHT] = $parent->[DOWN]; $parent->[DOWN] = $node; last UP; }
36 $parent->[DOWN] = $node; $node->[RIGHT] = undef;
37 $parent->[LEN] = $nlen;
38 $node = $parent; $parent = $node->[UP];
41 if ($nlen > $MAX) { $MAX = $nlen; }
48 if (!defined $node->[RIGHT]) {
50 if (defined $node->[DOWN]) { print " "; print_chain $node->[DOWN]; }
55 if (defined $node->[DOWN]) { print " "; print_chain $node->[DOWN]; }
56 $node = $node->[RIGHT]; last ALT unless defined $node;
63 for my $node (@WINNERS) { print_chain $node; print "\n"; }