```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
type Node struct {
children [26]*Node
taken bool
}
func newNode() *Node {
return &Node{taken: false}
}
func (root *Node) insert(s string) {
node := root
for _, ch := range s {
idx := ch - 'a'
if node.children[idx] == nil {
node.children[idx] = newNode()
}
node = node.children[idx]
}
}
func main() {
in := bufio.NewReader(os.Stdin)
var n int
fmt.Fscan(in, &n)
vars := make([]string, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &vars[i])
}
sort.Slice(vars, func(i, j int) bool {
if len(vars[i]) != len(vars[j]) {
return len(vars[i]) < len(vars[j])
}
return vars[i] < vars[j]
})
root := newNode()
for _, s := range vars {
root.insert(s)
}
var sum int64
for _, s := range vars {
node := root
for k := 1; k <= len(s); k++ {
ch := s[k-1]
idx := ch - 'a'
node = node.children[idx]
if !node.taken {
node.taken = true
sum += int64(k)
break
}
}
}
fmt.Println(sum)
}
```