← Home
 ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	S := scanner.Text()
	n := len(S)

	lcp := make([][]uint16, n+1)
	for i := range lcp {
		lcp[i] = make([]uint16, n+1)
	}
	for i := n - 1; i >= 0; i-- {
		for j := n - 1; j >= 0; j-- {
			if S[i] == S[j] {
				lcp[i][j] = 1 + lcp[i+1][j+1]
			}
		}
	}

	isLess := func(a, b, c, d int) bool {
		len1 := b - a
		len2 := d - c
		minLen := len1
		if len2 < minLen {
			minLen = len2
		}
		if int(lcp[a][c]) >= minLen {
			return len1 < len2
		}
		return S[a+int(lcp[a][c])] < S[c+int(lcp[a][c])]
	}

	dp := make([]int, n+1)
	prev := make([]int, n+1)
	for i := range dp {
		dp[i] = -1
	}
	dp[0] = 0
	prev[0] = -1

	for i := 1; i <= n; i++ {
		for j := 0; j < i; j++ {
			if dp[j] == -1 {
				continue
			}
			if j == 0 {
				if dp[i] < 1 {
					dp[i] = 1
					prev[i] = 0
				}
			} else {
				if isLess(prev[j], j, j, i) {
					if dp[i] < dp[j]+1 {
						dp[i] = dp[j] + 1
						prev[i] = j
					}
				}
			}
		}
	}

	words := make([]string, 0, dp[n])
	pos := n
	for pos > 0 {
		start := prev[pos]
		words = append(words, S[start:pos])
		pos = start
	}
	for i, j := 0, len(words)-1; i < j; i, j = i+1, j-1 {
		words[i], words[j] = words[j], words[i]
	}

	fmt.Println(dp[n])
	for _, w := range words {
		fmt.Println(w)
	}
}
```