X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/wordchain/blobdiff_plain/ed71412555b7ef3b16544e33f21fbd521b21b9ae..3bbec421c59fe8feefefe89a5f33cf47ea4a08c8:/chain.go diff --git a/chain.go b/chain.go index 8f1b450..2d6d2c2 100644 --- a/chain.go +++ b/chain.go @@ -43,29 +43,44 @@ func main() { } 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") } }