}
max := 0
+ var winners *wordnode = nil; winners_tail := &winners
for word, node := range words {
wlen := len(word)
if wlen <= 1 { continue }
parent := words[word[:wlen - 1]]
+ if parent == nil { continue }
node.up = parent
- for parent != nil {
- nlen := node.len + 1
- plen := parent.len
- if nlen < plen {
+ nlen := node.len
+ for {
+ if parent == nil {
+ if nlen >= max {
+ if nlen > max {
+ max = nlen
+ *winners_tail = nil
+ winners_tail = &winners
+ }
+ *winners_tail = node
+ winners_tail = &node.right
+ }
break
- } else if nlen > plen {
- parent.down = nil
- parent.len = nlen
- if nlen > max { max = nlen }
}
- if parent.down != node {
+ nlen += 1; plen := parent.len
+ if plen > nlen {
+ break
+ } else if plen == nlen {
node.right = parent.down; parent.down = node
+ break
}
+ parent.down = node; node.right = nil
+ parent.len = nlen
node = parent; parent = node.up
}
}
- for _, node := range words {
- if node.len == max { print_chain(node); fmt.Printf("\n") }
+ *winners_tail = nil
+ var next *wordnode
+ for node := winners; node != nil; node = next {
+ next = node.right; node.right = nil
+ print_chain(node); fmt.Printf("\n")
}
}