#include <bits/stdc++.h>
using namespace std;
#define Long long long
#define bint __int128
#define _3bkarm cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
int c;
vector<vector<int>> adj;
vector<bool> vis;
vector<int> comp;
void dfs(int v) {
vis[v] = true;
comp.push_back(v);
for (int u : adj[v]) {
if (vis[u]) continue;
dfs(u);
}
}
int solve() {
int ans = 0;
queue<int> q;
vis.assign(c, false);
vector<int> side(c, -1);
for (int v = 1; v < c; ++v) {
if (not vis[v]) {
comp.clear(), dfs(v);
q.push(v), side[v] = 0;
while ( not q.empty() ) {
int p = q.front();
q.pop();
for (int u : adj[p]) {
if (side[u] == -1) {
side[u] = side[p] ^ 1;
q.push(u);
}
}
}
int l = 0, r = 0;
for (int node : comp) {
if (side[node] == 0) ++l;
else ++r;
}
ans += max(l, r);
}
}
return ans;
}
void get_shit_done() {
int n, m;
cin >> n >> m;
vector< vector<char> > g( n + 1, vector<char>(m + 1) );
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> g[i][j];
}
}
int length;
cin >> length;
string s;
cin >> s;
c = 1;
vector< vector<int> > gl( n + 1, vector<int>(m + 1, -1) );
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
int at = j, p = 0;
while ( p < length and at <= m and g[i][at] == s[p] ) ++at, ++p;
if (p == length) {
for (int k = j; k < at; ++k) gl[i][k] = c;
++c;
}
j = max(j, at - 1);
}
}
vector< vector<int> > gr( n + 1, vector<int>(m + 1, -1) );
for (int j = 1; j <= m; ++j) {
for (int i = 1; i <= n; ++i) {
int at = i, p = 0;
while ( p < length and at <= n and g[at][j] == s[p] ) ++at, ++p;
if (p == length) {
for (int k = i; k < at; ++k) gr[k][j] = c;
++c;
}
i = max(i, at - 1);
}
}
adj.assign(c, {});
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if ( gl[i][j] != -1 and gr[i][j] != -1 ) {
adj[ gl[i][j] ].push_back( gr[i][j] );
adj[ gr[i][j] ].push_back( gl[i][j] );
}
}
}
cout << solve() << '\n';
}
signed main() {
_3bkarm
freopen("grid.in", "r", stdin);
int ts = 1;
cin >> ts;
while (ts--) {
get_shit_done();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBMb25nIGxvbmcgbG9uZwojZGVmaW5lIGJpbnQgX19pbnQxMjgKI2RlZmluZSBfM2JrYXJtIGNpbi50aWUoTlVMTCk7IGNvdXQudGllKE5VTEwpOyBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgppbnQgYzsKdmVjdG9yPHZlY3RvcjxpbnQ+PiBhZGo7Cgp2ZWN0b3I8Ym9vbD4gdmlzOwp2ZWN0b3I8aW50PiBjb21wOwp2b2lkIGRmcyhpbnQgdikgewogICAgdmlzW3ZdID0gdHJ1ZTsKICAgIGNvbXAucHVzaF9iYWNrKHYpOwogICAgZm9yIChpbnQgdSA6IGFkalt2XSkgewogICAgICAgIGlmICh2aXNbdV0pIGNvbnRpbnVlOwogICAgICAgIGRmcyh1KTsKICAgIH0KfQoKaW50IHNvbHZlKCkgewogICAgaW50IGFucyA9IDA7CiAgICBxdWV1ZTxpbnQ+IHE7CiAgICB2aXMuYXNzaWduKGMsIGZhbHNlKTsKICAgIHZlY3RvcjxpbnQ+IHNpZGUoYywgLTEpOwogICAgZm9yIChpbnQgdiA9IDE7IHYgPCBjOyArK3YpIHsKICAgICAgICBpZiAobm90IHZpc1t2XSkgewogICAgICAgICAgICBjb21wLmNsZWFyKCksIGRmcyh2KTsKICAgICAgICAgICAgcS5wdXNoKHYpLCBzaWRlW3ZdID0gMDsKICAgICAgICAgICAgd2hpbGUgKCBub3QgcS5lbXB0eSgpICkgewogICAgICAgICAgICAgICAgaW50IHAgPSBxLmZyb250KCk7CiAgICAgICAgICAgICAgICBxLnBvcCgpOwogICAgICAgICAgICAgICAgZm9yIChpbnQgdSA6IGFkaltwXSkgewogICAgICAgICAgICAgICAgICAgIGlmIChzaWRlW3VdID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVbdV0gPSBzaWRlW3BdIF4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXNoKHUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgbCA9IDAsIHIgPSAwOwogICAgICAgICAgICBmb3IgKGludCBub2RlIDogY29tcCkgewogICAgICAgICAgICAgICAgaWYgKHNpZGVbbm9kZV0gPT0gMCkgKytsOwogICAgICAgICAgICAgICAgZWxzZSArK3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYW5zICs9IG1heChsLCByKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYW5zOwp9Cgp2b2lkIGdldF9zaGl0X2RvbmUoKSB7CiAgICBpbnQgbiwgbTsKICAgIGNpbiA+PiBuID4+IG07CgogICAgdmVjdG9yPCB2ZWN0b3I8Y2hhcj4gPiBnKCBuICsgMSwgdmVjdG9yPGNoYXI+KG0gKyAxKSApOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgKytqKSB7CiAgICAgICAgICAgIGNpbiA+PiBnW2ldW2pdOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgbGVuZ3RoOwogICAgY2luID4+IGxlbmd0aDsKCiAgICBzdHJpbmcgczsKICAgIGNpbiA+PiBzOwoKICAgIGMgPSAxOwogICAgdmVjdG9yPCB2ZWN0b3I8aW50PiA+IGdsKCBuICsgMSwgdmVjdG9yPGludD4obSArIDEsIC0xKSApOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgKytqKSB7CiAgICAgICAgICAgIGludCBhdCA9IGosIHAgPSAwOwogICAgICAgICAgICB3aGlsZSAoIHAgPCBsZW5ndGggYW5kIGF0IDw9IG0gYW5kIGdbaV1bYXRdID09IHNbcF0gKSArK2F0LCArK3A7CiAgICAgICAgICAgIGlmIChwID09IGxlbmd0aCkgewogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IGo7IGsgPCBhdDsgKytrKSBnbFtpXVtrXSA9IGM7CiAgICAgICAgICAgICAgICArK2M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaiA9IG1heChqLCBhdCAtIDEpOwogICAgICAgIH0KICAgIH0KCiAgICB2ZWN0b3I8IHZlY3RvcjxpbnQ+ID4gZ3IoIG4gKyAxLCB2ZWN0b3I8aW50PihtICsgMSwgLTEpICk7CiAgICBmb3IgKGludCBqID0gMTsgaiA8PSBtOyArK2opIHsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICAgICAgaW50IGF0ID0gaSwgcCA9IDA7CiAgICAgICAgICAgIHdoaWxlICggcCA8IGxlbmd0aCBhbmQgYXQgPD0gbiBhbmQgZ1thdF1bal0gPT0gc1twXSApICsrYXQsICsrcDsKICAgICAgICAgICAgaWYgKHAgPT0gbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gaTsgayA8IGF0OyArK2spIGdyW2tdW2pdID0gYzsKICAgICAgICAgICAgICAgICsrYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpID0gbWF4KGksIGF0IC0gMSk7CiAgICAgICAgfQogICAgfQoKICAgIGFkai5hc3NpZ24oYywge30pOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgKytqKSB7CiAgICAgICAgICAgIGlmICggZ2xbaV1bal0gIT0gLTEgYW5kIGdyW2ldW2pdICE9IC0xICkgewogICAgICAgICAgICAgICAgYWRqWyBnbFtpXVtqXSBdLnB1c2hfYmFjayggZ3JbaV1bal0gKTsKICAgICAgICAgICAgICAgIGFkalsgZ3JbaV1bal0gXS5wdXNoX2JhY2soIGdsW2ldW2pdICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgY291dCA8PCBzb2x2ZSgpIDw8ICdcbic7Cn0KCnNpZ25lZCBtYWluKCkgewogICAgXzNia2FybQogICAgZnJlb3BlbigiZ3JpZC5pbiIsICJyIiwgc3RkaW4pOwoKICAgIGludCB0cyA9IDE7CiAgICBjaW4gPj4gdHM7CiAgICB3aGlsZSAodHMtLSkgewogICAgICAgIGdldF9zaGl0X2RvbmUoKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==