main.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. )
  8. func readInt(s *bufio.Scanner) int {
  9. s.Scan()
  10. i, _ := strconv.ParseInt(s.Text(), 10, 32)
  11. return int(i)
  12. }
  13. func readStr(s *bufio.Scanner) string {
  14. s.Scan()
  15. return s.Text()
  16. }
  17. func leastSwitch(scanner *bufio.Scanner) []int {
  18. answer := make([]int, 0)
  19. caseCnt := readInt(scanner)
  20. for i := 0; i < caseCnt; i++ {
  21. engineCnt := readInt(scanner)
  22. for j := 0; j < engineCnt; j++ {
  23. readStr(scanner)
  24. }
  25. queryCnt := readInt(scanner)
  26. if queryCnt == 0 {
  27. answer = append(answer, 0)
  28. continue // Go to next case
  29. }
  30. querySet := make(map[string]bool) // A set stores current queries
  31. ans := 0
  32. for j := 0; j < queryCnt; j++ {
  33. engine := readStr(scanner)
  34. if _, ok := querySet[engine]; !ok {
  35. if len(querySet) == engineCnt-1 {
  36. querySet = make(map[string]bool)
  37. ans++
  38. }
  39. querySet[engine] = true
  40. }
  41. }
  42. answer = append(answer, ans)
  43. }
  44. return answer
  45. }
  46. func main() {
  47. inputFiles := []string{"A-small-practice.in", "A-large-practice.in", "test.in"}
  48. outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
  49. const (
  50. small = iota
  51. large
  52. test
  53. )
  54. fileType := large
  55. fin, _ := os.Open(inputFiles[fileType])
  56. defer fin.Close()
  57. scanner := bufio.NewScanner(fin)
  58. answer := leastSwitch(scanner)
  59. fout, _ := os.Create(outputFiles[fileType])
  60. defer fout.Close()
  61. for i, n := range answer {
  62. s := fmt.Sprintf("Case #%d: %d\n", i+1, n)
  63. fout.WriteString(s)
  64. }
  65. }