package main import ( "bufio" "fmt" "os" "strconv" ) func readInt(s *bufio.Scanner) int { s.Scan() i, _ := strconv.ParseInt(s.Text(), 10, 32) return int(i) } func readStr(s *bufio.Scanner) string { s.Scan() return s.Text() } func leastSwitch(scanner *bufio.Scanner) []int { caseCnt := readInt(scanner) answer := make([]int, caseCnt) for i := 0; i < caseCnt; i++ { engineCnt := readInt(scanner) for j := 0; j < engineCnt; j++ { readStr(scanner) } queryCnt := readInt(scanner) if queryCnt == 0 { answer = append(answer, 0) continue // Go to next case } querySet := make(map[string]bool) // A set stores current queries for j := 0; j < queryCnt; j++ { engine := readStr(scanner) if _, ok := querySet[engine]; !ok { if len(querySet) == engineCnt-1 { querySet = make(map[string]bool) answer[i]++ } querySet[engine] = true } } } return answer } func main() { inputFiles := []string{"A-small-practice.in", "A-large-practice.in", "test.in"} outputFiles := []string{"result-small.out", "result-large.out", "test.out"} const ( small = iota large test ) fileType := large fin, _ := os.Open(inputFiles[fileType]) defer fin.Close() scanner := bufio.NewScanner(fin) answer := leastSwitch(scanner) fout, _ := os.Create(outputFiles[fileType]) defer fout.Close() for i, n := range answer { s := fmt.Sprintf("Case #%d: %d\n", i+1, n) fout.WriteString(s) } }