#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1001;
int n, m, k;
int dp[N][N]; //整个操作过程中数组最大容量的最小值
int pre[N][N]; //在删除k个相同数的条件下将1 ~ i, 1 ~ j里的数字放进数组后的长度
void solve()
{
cin >> n >> m >> k;
vector<int> a(n + 1), b(m + 1);
for(int i = 1; i <= n; i ++ ) cin >> a[i];
for(int i = 1; i <= m; i ++ ) cin >> b[i];
//预处理pre数组
map<int, int> mp;
int cap = 0;
for(int i = 0; i <= n; i ++ )
{
mp.clear();
cap = 0;
for(int j = 1; j <= i; j ++ )
{
cap ++;
if(++ mp[a[j]] == k) mp[a[j]] = 0, cap -= k;
}
for(int j = 0; j <= m; j ++ )
{
if(j)
{
cap ++;
if(++ mp[b[j]] == k) mp[b[j]] = 0, cap -= k;
}
pre[i][j] = cap;
}
}
//初始化
memset(dp, 0, sizeof dp);
for(int i = 1; i <= n; i ++ )
{
dp[i][0] = max(pre[i - 1][0] + 1, dp[i - 1][0]);
}
for(int i = 1; i <= m; i ++ )
{
dp[0][i] = max(pre[0][i - 1] + 1, dp[0][i - 1]);
}
//状态转移
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= m; j ++ )
{
int ans1 = max(pre[i - 1][j] + 1, dp[i - 1][j]);
int ans2 = max(pre[i][j - 1] + 1, dp[i][j - 1]);
dp[i][j] = min(ans1, ans2);
}
cout << dp[n][m] << endl;
}
signed main()
{
int t;
cin >> t;
while(t --) solve();
return 0;
}