5 import ("bufio"; "fmt"; "os")
10 up, down, right *wordnode
13 func print_chain(node *wordnode) {
14 if node.right == nil {
15 fmt.Printf("%s", *node.word)
18 print_chain(node.down)
23 fmt.Printf("%s", *node.word)
26 print_chain(node.down)
29 if node == nil { break }
37 words := make(map[string] *wordnode)
39 scanner := bufio.NewScanner(os.Stdin)
41 word := scanner.Text()
42 words[word] = &wordnode { &word, 1, nil, nil, nil }
46 var winners *wordnode = nil; winners_tail := &winners
47 for word, node := range words {
49 if wlen <= 1 { continue }
50 parent := words[word[:wlen - 1]]
51 if parent == nil { continue }
60 winners_tail = &winners
63 winners_tail = &node.right
67 nlen += 1; plen := parent.len
70 } else if plen == nlen {
71 node.right = parent.down; parent.down = node
74 parent.down = node; node.right = nil
76 node = parent; parent = node.up
82 for node := winners; node != nil; node = next {
83 next = node.right; node.right = nil
84 print_chain(node); fmt.Printf("\n")