1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package main
- import (
- "fmt"
- )
- func main() {
- var N, k int
- fmt.Scan(&N)
- for cid := 0; cid < N; cid++ {
- fmt.Scan(&k)
- var S string
- fmt.Scan(&S)
- n := len(S)
- // edge[x][y] means the weight of edge: x -> y
- // init[x][y] means the weight of edge: init point x -> y
- edge, init := make([][]int, k), make([][]int, k)
- for i := 0; i < k; i++ {
- edge[i], init[i] = make([]int, k), make([]int, k)
- }
- for x := 0; x < k; x++ {
- for y := 0; y < k; y++ {
- if x != y {
- for o := 0; o < n; o += k {
- if S[o+x] != S[o+y] {
- edge[x][y]++
- }
- }
- for o := 0; o < n-k; o += k {
- if S[o+x] != S[o+k+y] {
- init[x][y]++
- }
- } // Note: y -> x and x -> y is NOT THE SAME INIT edge!!!
- }
- }
- }
- dp := make([][]int, 1<<uint(k))
- for i := range dp {
- dp[i] = make([]int, k)
- }
- const inf = 1000000
- ans := inf
- for beg := 0; beg < k; beg++ {
- for i := range dp {
- for j := range dp[i] {
- dp[i][j] = inf
- }
- }
- dp[1<<uint(beg)][beg] = 1
- for mask := 0; mask < (1 << uint(k)); mask++ {
- for i := 0; i < k; i++ {
- if dp[mask][i] < inf {
- for j := 0; j < k; j++ {
- newset := mask | (1 << uint(j))
- if newset != mask {
- dp[newset][j] = minInt(dp[newset][j], dp[mask][i]+edge[i][j])
- }
- }
- }
- }
- }
- for i := 0; i < k; i++ {
- ans = minInt(ans, dp[(1<<uint(k))-1][i]+init[i][beg])
- }
- }
- fmt.Printf("Case #%d: %d\n", cid+1, ans)
- }
- }
|