package main

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

func analyzeDesignFormation(availableTowels []string, requested string) (int, bool) {
	n := len(requested)
	combinationCounts := make([]int, n+1) // combinationCounts[i] indicates the number of ways to form requested[:i]
	combinationCounts[0] = 1              // Base case: one way to form an empty string

	// Build the combinationCounts table
	for i := 1; i <= n; i++ {
		for _, towel := range availableTowels {
			towelLen := len(towel)
			if i >= towelLen && requested[i-towelLen:i] == towel {
				combinationCounts[i] += combinationCounts[i-towelLen]
			}
		}
	}

	return combinationCounts[n], combinationCounts[n] > 0 // Return the number of combinations and a boolean indicating if it can be formed
}

func main() {
	// Open the input file
	file, err := os.Open("input.txt")
	if err != nil {
		fmt.Printf("Error opening file: %v\n", err)
		return
	}
	defer file.Close()

	// Read the file line by line
	scanner := bufio.NewScanner(file)
	lines := []string{}
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}
	if err := scanner.Err(); err != nil {
		fmt.Printf("Error reading file: %v\n", err)
		return
	}

	// Parse the input
	if len(lines) < 2 {
		fmt.Println("Invalid input format: not enough lines")
		return
	}

	// First line: list of available colors
	availableTowels := strings.Split(strings.TrimSpace(lines[0]), ", ")

	// Remaining lines (after the blank line): requested designs
	var requestedTowels []string
	for _, line := range lines[2:] { // Skip the blank line
		line = strings.TrimSpace(line)
		if line != "" {
			requestedTowels = append(requestedTowels, line)
		}
	}

	// Count total number of combinations to form all designs
	totalCombinations := 0
	totalFormable := 0
	for _, towel := range requestedTowels {
		combinations, formable := analyzeDesignFormation(availableTowels, towel)
		totalCombinations += combinations
		if formable {
			totalFormable++
		}
	}

	// Print the total result
	fmt.Printf("Total number of combinations to form all designs: %d\n", totalCombinations)
	fmt.Printf("Total number of designs that can be formed: %d\n", totalFormable)
}