#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
template <class T>
using V = vector<T>;
const ll inf = (1e18);
const ll mod = 1000000007;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll c, ll d) { return c / gcd(c, d) * d; }
struct __INIT {
  __INIT() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(15);
  }
} __init;
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
class UF {
 public:
  vector<int> par, num;
  int find(int v) { return (par[v] == v) ? v : (par[v] = find(par[v])); }
  explicit UF(int N) : par(N), num(N, 1) {
    iota((par).begin(), (par).end(), 0);
  }
  void unite(int u, int v) {
    u = find(u), v = find(v);
    if (u == v) return;
    if (num[u] < num[v]) swap(u, v);
    num[u] += num[v];
    par[v] = u;
  }
  bool same(int u, int v) { return find(u) == find(v); }
  bool ispar(int v) { return v = find(v); }
  int size(int v) { return num[find(v)]; }
};
int main() {
  int t;
  cin >> t;
  while (t--) {
    int n, k;
    cin >> n >> k;
    string s;
    cin >> s;
    int ans = 0;
    V<V<ll>> dat(k, V<ll>(26, 0));
    UF uf(k);
    for (int i = 0; i < k / 2; i++) {
      uf.unite(i, k - i - 1);
    }
    for (int i = 0; i < n / 2; i++) {
      uf.unite(i % k, (n - i - 1) % k);
    }
    for (int i = 0; i < n; i++) {
      dat[uf.find(i % k)][s[i] - 'a']++;
    }
    for (int i = 0; i < k; i++) {
      ll sum = 0, ma = 0;
      for (int j = 0; j < 26; j++) {
        sum += dat[i][j];
        chmax(ma, dat[i][j]);
      }
      ans += sum - ma;
    }
    cout << ans << "\n";
  }
}
