6 use constant { WORD => 0, LEN => 1, UP => 2, DOWN => 3, RIGHT => 4 };
11 $WORD{$_} = [$_, 1, undef, undef, undef];
15 WORD: while (my ($word, $node) = each %WORD) {
16 my $len = length $word;
17 my $parent = $len <= 1 ? undef : $WORD{substr $word, 0, $len - 1};
18 $node->[UP] = $parent;
19 my $nlen = $node->[LEN];
20 UP: while (defined $parent) {
21 my $plen = $parent->[LEN]; $nlen++;
24 elsif ($plen == $nlen)
25 { $node->[RIGHT] = $parent->[DOWN]; $parent->[DOWN] = $node; last UP; }
27 $parent->[DOWN] = $node; $node->[RIGHT] = undef;
28 $parent->[LEN] = $nlen;
29 $node = $parent; $parent = $node->[UP];
32 if ($nlen > $MAX) { $MAX = $nlen; }
39 if (!defined $node->[RIGHT]) {
41 if (defined $node->[DOWN]) { print " "; print_chain $node->[DOWN]; }
46 if (defined $node->[DOWN]) { print " "; print_chain $node->[DOWN]; }
47 $node = $node->[RIGHT]; last ALT unless defined $node;
54 for my $node (values %WORD)
55 { if ($node->[LEN] == $MAX) { print_chain $node; print "\n"; } }