/* -*-go-*- */ package main import ("bufio"; "fmt"; "os") type wordnode struct { word *string len int up, down, right *wordnode } func print_chain(node *wordnode) { if node.right == nil { fmt.Printf("%s", *node.word) if node.down != nil { fmt.Printf(" ") print_chain(node.down) } } else { fmt.Printf("{ ") for { fmt.Printf("%s", *node.word) if node.down != nil { fmt.Printf(" ") print_chain(node.down) } node = node.right if node == nil { break } fmt.Printf(" | ") } fmt.Printf(" }") } } func main() { words := make(map[string] *wordnode) scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { word := scanner.Text() words[word] = &wordnode { &word, 1, nil, nil, nil } } 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 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 } 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 } } *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") } }