```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
nStr, _ := reader.ReadString('\n')
n, _ := strconv.Atoi(strings.TrimSpace(nStr))
line, _ := reader.ReadString('\n')
parts := strings.Fields(line)
digitSet := make(map[int]bool)
for i := 0; i < n; i++ {
d, _ := strconv.Atoi(parts[i])
digitSet[d] = true
}
var results []string
for length := 4; length <= 12; length++ {
halfLen := (length + 1) / 2
var generate func(pos int, current []byte)
generate = func(pos int, current []byte) {
if pos == halfLen {
full := make([]byte, length)
copy(full, current)
for i := 0; i < length/2; i++ {
full[length-1-i] = current[i]
}
s := string(full)
if !containsAllDigits(s, digitSet) {
return
}
for l1 := 1; l1 <= 3 && l1 <= length; l1++ {
for l2 := 1; l2 <= 3 && l1+l2 <= length; l2++ {
for l3 := 1; l3 <= 3 && l1+l2+l3 <= length; l3++ {
l4 := length - l1 - l2 - l3
if l4 < 1 || l4 > 3 {
continue
}
p1 := s[0:l1]
p2 := s[l1 : l1+l2]
p3 := s[l1+l2 : l1+l2+l3]
p4 := s[l1+l2+l3:]
if isValidPart(p1) && isValidPart(p2) && isValidPart(p3) && isValidPart(p4) {
ip := p1 + "." + p2 + "." + p3 + "." + p4
results = append(results, ip)
}
}
}
}
return
}
for d := 0; d <= 9; d++ {
if digitSet[d] {
generate(pos+1, append(current, byte('0'+d)))
}
}
}
generate(0, []byte{})
}
fmt.Println(len(results))
for _, ip := range results {
fmt.Println(ip)
}
}
func containsAllDigits(s string, digitSet map[int]bool) bool {
used := make([]bool, 10)
for _, ch := range s {
used[ch-'0'] = true
}
for d := range digitSet {
if !used[d] {
return false
}
}
return true
}
func isValidPart(s string) bool {
if len(s) == 0 {
return false
}
if s[0] == '0' {
return len(s) == 1
}
if len(s) == 3 {
if s[0] > '2' {
return false
}
if s[0] == '2' {
if s[1] > '5' {
return false
}
if s[1] == '5' && s[2] > '5' {
return false
}
}
}
return true
}
```