main.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var N, k int
  7. fmt.Scan(&N)
  8. for cid := 0; cid < N; cid++ {
  9. fmt.Scan(&k)
  10. var S string
  11. fmt.Scan(&S)
  12. n := len(S)
  13. // edge[x][y] means the weight of edge: x -> y
  14. // init[x][y] means the weight of edge: init point x -> y
  15. edge, init := make([][]int, k), make([][]int, k)
  16. for i := 0; i < k; i++ {
  17. edge[i], init[i] = make([]int, k), make([]int, k)
  18. }
  19. for x := 0; x < k; x++ {
  20. for y := 0; y < k; y++ {
  21. if x != y {
  22. for o := 0; o < n; o += k {
  23. if S[o+x] != S[o+y] {
  24. edge[x][y]++
  25. }
  26. }
  27. for o := 0; o < n-k; o += k {
  28. if S[o+x] != S[o+k+y] {
  29. init[x][y]++
  30. }
  31. } // Note: y -> x and x -> y is NOT THE SAME INIT edge!!!
  32. }
  33. }
  34. }
  35. dp := make([][]int, 1<<uint(k))
  36. for i := range dp {
  37. dp[i] = make([]int, k)
  38. }
  39. const inf = 1000000
  40. ans := inf
  41. for beg := 0; beg < k; beg++ {
  42. for i := range dp {
  43. for j := range dp[i] {
  44. dp[i][j] = inf
  45. }
  46. }
  47. dp[1<<uint(beg)][beg] = 1
  48. for mask := 0; mask < (1 << uint(k)); mask++ {
  49. for i := 0; i < k; i++ {
  50. if dp[mask][i] < inf {
  51. for j := 0; j < k; j++ {
  52. newset := mask | (1 << uint(j))
  53. if newset != mask {
  54. dp[newset][j] = minInt(dp[newset][j], dp[mask][i]+edge[i][j])
  55. }
  56. }
  57. }
  58. }
  59. }
  60. for i := 0; i < k; i++ {
  61. ans = minInt(ans, dp[(1<<uint(k))-1][i]+init[i][beg])
  62. }
  63. }
  64. fmt.Printf("Case #%d: %d\n", cid+1, ans)
  65. }
  66. }