12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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)
- }
- }
|