main.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. caseCnt := readInt(scanner)
  19. answer := make([]int, caseCnt)
  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. for j := 0; j < queryCnt; j++ {
  32. engine := readStr(scanner)
  33. if _, ok := querySet[engine]; !ok {
  34. if len(querySet) == engineCnt-1 {
  35. querySet = make(map[string]bool)
  36. answer[i]++
  37. }
  38. querySet[engine] = true
  39. }
  40. }
  41. }
  42. return answer
  43. }
  44. func main() {
  45. inputFiles := []string{"A-small-practice.in", "A-large-practice.in", "test.in"}
  46. outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
  47. const (
  48. small = iota
  49. large
  50. test
  51. )
  52. fileType := large
  53. fin, _ := os.Open(inputFiles[fileType])
  54. defer fin.Close()
  55. scanner := bufio.NewScanner(fin)
  56. answer := leastSwitch(scanner)
  57. fout, _ := os.Create(outputFiles[fileType])
  58. defer fout.Close()
  59. for i, n := range answer {
  60. s := fmt.Sprintf("Case #%d: %d\n", i+1, n)
  61. fout.WriteString(s)
  62. }
  63. }