#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define pb push_back
#define all(a) a.begin(), a.end()
typedef long long ll;
typedef pair<int, int> ii;
const int N = 25 + 1;
int f[N][N][N];
char a[N][N];
int lps[N * 2];
int n, m, mod;
int SizeS;
string s;
void buildKmp(const string &s)
{
int n = s.size();
for(int i = 1; i < n; i++)
{
int j = lps[i - 1];
while(j > 0 && s[j] != s[i])
j = lps[j - 1];
if(s[i] == s[j])
j++;
lps[i] = j;
}
}
int dp(int i, int j, int kmp)
{
if(i > m || j > n)
return 0; // nếu đi ra khỏi bảng chữ
if(i == m && j == n)
return (kmp == SizeS); // nếu tới ô kết thúc
if(kmp == SizeS)
return (dp(i + 1, j, kmp) + dp(i, j + 1, kmp)) % mod; // nếu từ khóa đã xuất hiện thì tìm số cách đi như bình thường
int &res = f[i][j][kmp];
if(~res) return res;
res = 0;
for(int branch = 0; branch <= 1; branch++) // đi xuống hoặc qua phải
{
int x = i, y = j;
if(branch == 0) x++; else y++;
int tmp = kmp;
while(tmp > 0 && s[tmp] != a[x][y])
tmp = lps[tmp - 1];
if(s[tmp] == a[x][y])
tmp++;
res = (res + dp(x, y, tmp)) % mod;
}
return res;
}
void solve()
{
cin >> m >> n >> mod;
cin >> s;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
cin >> a[i][j];
SizeS = s.size();
buildKmp(s);
memset(f, -1, sizeof f);
cout << dp(1, 1, a[1][1] == s[0]);
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
int t = 1;
// cin >> t;
while(t--) solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKI2RlZmluZSBGIGZpcnN0CiNkZWZpbmUgUyBzZWNvbmQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBhbGwoYSkgYS5iZWdpbigpLCBhLmVuZCgpCiAKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gaWk7CiAKY29uc3QgaW50IE4gPSAyNSArIDE7CgppbnQgZltOXVtOXVtOXTsKY2hhciBhW05dW05dOwppbnQgbHBzW04gKiAyXTsKaW50IG4sIG0sIG1vZDsKaW50IFNpemVTOwpzdHJpbmcgczsKCnZvaWQgYnVpbGRLbXAoY29uc3Qgc3RyaW5nICZzKQp7CiAgICBpbnQgbiA9IHMuc2l6ZSgpOwogICAgZm9yKGludCBpID0gMTsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBpbnQgaiA9IGxwc1tpIC0gMV07CiAgICAgICAgd2hpbGUoaiA+IDAgJiYgc1tqXSAhPSBzW2ldKQogICAgICAgICAgICBqID0gbHBzW2ogLSAxXTsKICAgICAgICBpZihzW2ldID09IHNbal0pCiAgICAgICAgICAgIGorKzsKICAgICAgICBscHNbaV0gPSBqOwogICAgfQp9CiAKaW50IGRwKGludCBpLCBpbnQgaiwgaW50IGttcCkKewogICAgaWYoaSA+IG0gfHwgaiA+IG4pIAogICAgICAgIHJldHVybiAwOyAvLyBu4bq/dSDEkWkgcmEga2jhu49pIGLhuqNuZyBjaOG7rwogICAgaWYoaSA9PSBtICYmIGogPT0gbikgCiAgICAgICAgcmV0dXJuIChrbXAgPT0gU2l6ZVMpOyAvLyBu4bq/dSB04bubaSDDtCBr4bq/dCB0aMO6YwogICAgaWYoa21wID09IFNpemVTKQogICAgICAgICByZXR1cm4gKGRwKGkgKyAxLCBqLCBrbXApICsgZHAoaSwgaiArIDEsIGttcCkpICUgbW9kOyAvLyBu4bq/dSB04burIGtow7NhIMSRw6MgeHXhuqV0IGhp4buHbiB0aMOsIHTDrG0gc+G7kSBjw6FjaCDEkWkgbmjGsCBiw6xuaCB0aMaw4budbmcKICAgIAogICAgaW50ICZyZXMgPSBmW2ldW2pdW2ttcF07CiAgICBpZih+cmVzKSByZXR1cm4gcmVzOwogICAgCiAgICByZXMgPSAwOwogICAgZm9yKGludCBicmFuY2ggPSAwOyBicmFuY2ggPD0gMTsgYnJhbmNoKyspIC8vIMSRaSB4deG7kW5nIGhv4bq3YyBxdWEgcGjhuqNpCiAgICB7CiAgICAgICAgaW50IHggPSBpLCB5ID0gajsKICAgICAgICBpZihicmFuY2ggPT0gMCkgeCsrOyBlbHNlIHkrKzsKCiAgICAgICAgaW50IHRtcCA9IGttcDsgCiAgICAgICAgd2hpbGUodG1wID4gMCAmJiBzW3RtcF0gIT0gYVt4XVt5XSkKICAgICAgICAgICAgdG1wID0gbHBzW3RtcCAtIDFdOwogICAgICAgIGlmKHNbdG1wXSA9PSBhW3hdW3ldKQogICAgICAgICAgICB0bXArKzsKCiAgICAgICAgcmVzID0gKHJlcyArIGRwKHgsIHksIHRtcCkpICUgbW9kOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKdm9pZCBzb2x2ZSgpCnsKICAgIGNpbiA+PiBtID4+IG4gPj4gbW9kOwogICAgY2luID4+IHM7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG07IGkrKykKICAgICAgICBmb3IoaW50IGogPSAxOyBqIDw9IG47IGorKykKICAgICAgICAgICAgY2luID4+IGFbaV1bal07CgogICAgU2l6ZVMgPSBzLnNpemUoKTsKICAgIGJ1aWxkS21wKHMpOwogICAgbWVtc2V0KGYsIC0xLCBzaXplb2YgZik7CiAgICBjb3V0IDw8IGRwKDEsIDEsIGFbMV1bMV0gPT0gc1swXSk7Cn0KIApzaWduZWQgbWFpbigpCnsKICAgIGNpbi50aWUoMCktPnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGludCB0ID0gMTsKICAgIC8vIGNpbiA+PiB0OwogICAgd2hpbGUodC0tKSBzb2x2ZSgpOwogICAgcmV0dXJuIDA7Cn0=