/* -*-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 for word, node := range words { wlen := len(word) if wlen <= 1 { continue } parent := words[word[:wlen - 1]] node.up = parent for parent != nil { nlen := node.len + 1 plen := parent.len if nlen < plen { break } else if nlen > plen { parent.down = nil parent.len = nlen if nlen > max { max = nlen } } if parent.down != node { node.right = parent.down; parent.down = node } node = parent; parent = node.up } } for _, node := range words { if node.len == max { print_chain(node); fmt.Printf("\n") } } }