main.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func nextPerm(nums []int) bool {
  6. n := len(nums)
  7. if n < 2 {
  8. return false
  9. }
  10. i := n - 2
  11. for ; 0 <= i && nums[i+1] <= nums[i]; i-- {
  12. }
  13. if i == -1 {
  14. return false
  15. }
  16. j := i + 1
  17. for ; j+1 < n && nums[i] < nums[j+1]; j++ {
  18. }
  19. nums[i], nums[j] = nums[j], nums[i]
  20. for l, r := i+1, n-1; l < r; l, r = l+1, r-1 {
  21. nums[l], nums[r] = nums[r], nums[l]
  22. }
  23. return true
  24. }
  25. func countGroup(s string, perm []int) int {
  26. n, k := len(s), len(perm)
  27. prevByte := s[perm[0]]
  28. cnt := 1
  29. for offset := 0; offset < n; offset += k {
  30. i := 0
  31. if offset == 0 {
  32. i = 1
  33. }
  34. for ; i < k; i++ {
  35. if s[offset+perm[i]] != prevByte {
  36. cnt++
  37. }
  38. prevByte = s[offset+perm[i]]
  39. }
  40. }
  41. return cnt
  42. }
  43. func main() {
  44. var N, k int
  45. fmt.Scan(&N)
  46. for cid := 0; cid < N; cid++ {
  47. fmt.Scan(&k)
  48. var S string
  49. fmt.Scan(&S)
  50. perm := make([]int, k)
  51. for i := range perm {
  52. perm[i] = i
  53. }
  54. minGroup := countGroup(S, perm)
  55. for nextPerm(perm) {
  56. groupCnt := countGroup(S, perm)
  57. if groupCnt < minGroup {
  58. minGroup = groupCnt
  59. }
  60. }
  61. fmt.Printf("Case #%d: %d\n", cid+1, minGroup)
  62. }
  63. }