← Home
 ```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
}
```