传送门
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define debug cout<<"debug"<<endl
typedef long long ll;
typedef long double ld;
typedef pair<int, int> PII;
const double eps = 1e-8;
const double PI = 3.14159265358979323;
const int N = 2e5+10, M = 2*N, mod = 998244353;
const int INF = 0x3f3f3f3f;
int n, k;
string a, b;
int s[N];
void solve()
{
cin>>n>>k;
cin>>a>>b;
map<char, int> mp;
int idx = 0;
// 将是个不同的字符用数字替换
for(int i = 0; i<n; i++)
{
if(!mp[a[i]]) mp[a[i]] = idx++;
}
auto C2 = [](ll n) { return n*(n+1ll) / 2ll; };
if(idx<=k)
{
cout<<C2(n)<<endl;
return;
}
// 用数组的下标存放枚举位, 来进行二进制枚举
vector<int> st(idx, 0);
for(int i = 0; i<k; i++) st[i] = 1;
ll res = 0;
do{
// for(auto t : st) cout<<t<<" ";
// cout<<endl;
int len = 0;
ll cur = 0;
for(int i = 0; i<n; i++)
{
if(st[mp[a[i]]] || a[i] == b[i]) len++;
else{
cur += C2(len);
len = 0;
}
}
cur += C2(len);
res = max(res, cur);
}while(prev_permutation(st.begin(), st.end()));
// 用prev_permutation来枚举, 若是next_permutation则反过来
// 1 0 0 ==> 0 1 0 ==> 0 0 1
cout<<res<<endl;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int T;
T = 1;
cin>>T;
while(T -- )
{
solve();
}
return 0;
}