// ROOT : DRAGON3012009 : WA in Real Life
#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
#define ll long long
#define el "\n"
#define fi first
#define se second
#define _ROOT_ int main()
#define MAXN 205
#define ALPHA 26
#define Bit(i) (1LL << i )
#define INF (1ll<<30)
#define NAME "file"
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;
ll n, m, q, len, M ;
ll dp[MAXN][MAXN][MAXN ] ;
ll nxtA[MAXN][ALPHA] ;
ll nxtB[MAXN][ALPHA] ;
string a, b ;
ll Power(ll a, ll b ) {
ll res = 1;
while(b) {
if(b&1) res = a*res%M;
b>>=1;
a=a*a%M;
}
return res;
}
ll add(ll a, ll b ) {
return a + b >= M ? a + b - M : a + b;
}
ll mul(ll a, ll b ) {
return 1LL * (a%M) * (b%M) % M;
}
ll sub(ll a, ll b ) {
return a - b < 0 ? a - b + M : a - b;
}
ll divi(ll a, ll b) {
return 1LL * a * Power(b, M - 2 ) % M;
}
ll DP(ll pos, ll khopA, ll khopB ) {
if(pos > len ) {
return khopA <= n && khopB > m ;
}
ll &cur = dp[pos][khopA][khopB ] ;
if(cur != - 1 ) return cur ;
cur = 0 ;
REP(c, ALPHA ) {
ll nxt_A = nxtA[khopA + 1 ][c ] ;
ll nxt_B = nxtB[khopB + 1 ][c] ;
if(khopB > m) nxt_B = khopB ;
if(khopA > n) nxt_A = khopA ;
cur = add(cur, DP(pos + 1, nxt_A, nxt_B ) ) ;
}
return cur ;
}
void init() {
cin >> q >> len >> M ;
cin >> a >> b ;
n = a.size() ;
m = b.size() ;
a = " " + a ;
b = " " + b ;
REP(i, ALPHA ) {
nxtA[n + 1][i] = n + 1 ;
nxtB[m + 1][i] = m + 1 ;
}
FORD(i, n, 1 ) {
REP(j, ALPHA ) {
if(a[i] - 'a' == j) nxtA[i][j] = i ;
else nxtA[i][j] = nxtA[i + 1][j] ;
}
}
FORD(i, m, 1 ) {
REP(j, ALPHA ) {
if(b[i] - 'a' == j) nxtB[i][j] = i ;
else nxtB[i][j] = nxtB[i + 1][j] ;
}
}
}
bool checkTrue(string &tmp ) {
tmp = " " + tmp ;
ll ptr = 1 ;
FOR(i, 1, n ) if(a[i] == tmp[ptr ] ) ptr ++ ;
if(ptr <= len ) return false ;
ptr = 1 ;
FOR(i, 1, m ) if(b[i] == tmp[ptr ] ) ptr ++ ;
if(ptr > len ) return false ;
return true ;
}
void solve() {
memset(dp , -1 , sizeof dp ) ;
DP(1 , 0 , 0 ) ;
FOR(cnt, 1, q ) {
string x ;
cin >> x ;
if(!checkTrue(x)) {
cout << -1 << el ;
continue ;
}
ll khopA = 0, khopB = 0 ;
ll ans = 1 ;
FOR(i, 1, len ) {
REP(c, x[i] - 'a') {
ll nxt_A = nxtA[khopA + 1 ][c ] ;
ll nxt_B = nxtB[khopB + 1 ][c] ;
if(khopB > m) nxt_B = khopB ;
if(khopA > n) nxt_A = khopA ;
ans = add(ans, DP(i + 1, nxt_A, nxt_B )) ;
}
ll nxt_A = nxtA[khopA + 1 ][x[i] - 'a' ] ;
ll nxt_B = nxtB[khopB + 1 ][x[i] - 'a' ] ;
if(khopB > m) nxt_B = khopB ;
if(khopA > n) nxt_A = khopA ;
khopA = nxt_A, khopB = nxt_B ;
}
cout << ans << el ;
}
}
_ROOT_ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1; // cin >> t ;
while(t--) {
init();
solve();
}
return (0&0);
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkgOiBXQSBpbiBSZWFsIExpZmUKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGNvbXBhcmUodikgc29ydCgodikuYmVnaW4oKSwgKHYpLmVuZCgpKTsgKHYpLmVyYXNlKHVuaXF1ZSgodikuYmVnaW4oKSwgKHYpLmVuZCgpKSwgKHYpLmVuZCgpKTsKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBfUk9PVF8gaW50IG1haW4oKQojZGVmaW5lIE1BWE4gMjA1CiNkZWZpbmUgQUxQSEEgMjYKI2RlZmluZSBCaXQoaSkgKDFMTCA8PCBpICkKI2RlZmluZSBJTkYgKDFsbDw8MzApCiNkZWZpbmUgTkFNRSAiZmlsZSIKI2RlZmluZSBkZWJ1ZyhhKSBjb3V0IDw8ICNhIDw8ICIgPSAiIDw8IGEgPDwgZW5kbDsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmxsIG4sIG0sIHEsIGxlbiwgTSA7CmxsIGRwW01BWE5dW01BWE5dW01BWE4gXSA7CmxsIG54dEFbTUFYTl1bQUxQSEFdIDsKbGwgbnh0QltNQVhOXVtBTFBIQV0gOwpzdHJpbmcgYSwgYiA7CgpsbCBQb3dlcihsbCBhLCBsbCBiICkgewogICAgbGwgcmVzID0gMTsKICAgIHdoaWxlKGIpIHsKICAgICAgICBpZihiJjEpIHJlcyA9IGEqcmVzJU07CiAgICAgICAgYj4+PTE7CiAgICAgICAgYT1hKmElTTsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KbGwgYWRkKGxsIGEsIGxsIGIgKSB7CiAgICByZXR1cm4gYSArIGIgPj0gTSA/IGEgKyBiIC0gTSA6IGEgKyBiOwp9CmxsIG11bChsbCBhLCBsbCBiICkgIHsKICAgIHJldHVybiAxTEwgKiAoYSVNKSAqIChiJU0pICUgTTsKfQpsbCBzdWIobGwgYSwgbGwgYiApIHsKICAgIHJldHVybiBhIC0gYiA8IDAgPyBhIC0gYiArIE0gOiBhIC0gYjsKfQpsbCBkaXZpKGxsIGEsIGxsIGIpIHsKICAgIHJldHVybiAxTEwgKiBhICogUG93ZXIoYiwgTSAtIDIgKSAlIE07Cn0KCmxsIERQKGxsIHBvcywgbGwga2hvcEEsIGxsIGtob3BCICkgewogICAgaWYocG9zID4gbGVuICkgewogICAgICAgIHJldHVybiBraG9wQSA8PSBuICYmIGtob3BCID4gbSA7CiAgICB9CiAgICBsbCAmY3VyID0gZHBbcG9zXVtraG9wQV1ba2hvcEIgXSA7CiAgICBpZihjdXIgIT0gLSAxICkgcmV0dXJuIGN1ciA7CiAgICBjdXIgPSAwIDsKCiAgICBSRVAoYywgQUxQSEEgKSB7CiAgICAgICAgbGwgbnh0X0EgPSBueHRBW2tob3BBICsgMSBdW2MgXSA7CiAgICAgICAgbGwgbnh0X0IgPSBueHRCW2tob3BCICsgMSBdW2NdIDsKICAgICAgICBpZihraG9wQiA+IG0pIG54dF9CID0ga2hvcEIgOwogICAgICAgIGlmKGtob3BBID4gbikgbnh0X0EgPSBraG9wQSA7CgogICAgICAgIGN1ciA9IGFkZChjdXIsICBEUChwb3MgKyAxLCBueHRfQSwgbnh0X0IgKSApIDsKICAgIH0KICAgIHJldHVybiBjdXIgOwp9Cgp2b2lkIGluaXQoKSB7CiAgICBjaW4gPj4gcSA+PiBsZW4gPj4gTSA7CiAgICBjaW4gPj4gYSA+PiBiIDsKICAgIG4gPSBhLnNpemUoKSA7CiAgICBtID0gYi5zaXplKCkgOwogICAgYSA9ICIgIiArIGEgOwogICAgYiA9ICIgIiArIGIgOwogICAgUkVQKGksIEFMUEhBICkgewogICAgICAgIG54dEFbbiArIDFdW2ldID0gbiArIDEgOwogICAgICAgIG54dEJbbSArIDFdW2ldID0gbSArIDEgOwogICAgfQogICAgRk9SRChpLCBuLCAxICkgewogICAgICAgIFJFUChqLCBBTFBIQSApIHsKICAgICAgICAgICAgaWYoYVtpXSAtICdhJyA9PSBqKSBueHRBW2ldW2pdID0gaSA7CiAgICAgICAgICAgIGVsc2Ugbnh0QVtpXVtqXSA9IG54dEFbaSArIDFdW2pdIDsKICAgICAgICB9CiAgICB9CiAgICBGT1JEKGksIG0sIDEgKSB7CiAgICAgICAgUkVQKGosIEFMUEhBICkgewogICAgICAgICAgICBpZihiW2ldIC0gJ2EnID09IGopIG54dEJbaV1bal0gPSBpIDsKICAgICAgICAgICAgZWxzZSBueHRCW2ldW2pdID0gbnh0QltpICsgMV1bal0gOwogICAgICAgIH0KICAgIH0KfQoKYm9vbCBjaGVja1RydWUoc3RyaW5nICZ0bXAgKSB7CiAgICB0bXAgPSAiICIgKyB0bXAgOwogICAgbGwgcHRyID0gMSA7CiAgICBGT1IoaSwgMSwgbiApIGlmKGFbaV0gPT0gdG1wW3B0ciBdICkgcHRyICsrIDsKICAgIGlmKHB0ciA8PSBsZW4gKSByZXR1cm4gZmFsc2UgOwogICAgcHRyID0gMSA7CiAgICBGT1IoaSwgMSwgIG0gKSBpZihiW2ldID09IHRtcFtwdHIgXSApIHB0ciArKyA7CiAgICBpZihwdHIgPiBsZW4gKSByZXR1cm4gZmFsc2UgOwogICAgcmV0dXJuIHRydWUgOwp9Cgp2b2lkIHNvbHZlKCkgewogICAgbWVtc2V0KGRwICwgLTEgLCBzaXplb2YgZHAgKSA7CiAgICBEUCgxICwgMCAsIDAgKSA7CgogICAgRk9SKGNudCwgMSwgcSApIHsKICAgICAgICBzdHJpbmcgeCA7CiAgICAgICAgY2luID4+IHggOwogICAgICAgIGlmKCFjaGVja1RydWUoeCkpIHsKICAgICAgICAgICAgY291dCA8PCAtMSA8PCBlbCA7CiAgICAgICAgICAgIGNvbnRpbnVlIDsKICAgICAgICB9CiAgICAgICAgbGwga2hvcEEgPSAwLCBraG9wQiA9IDAgOwogICAgICAgIGxsIGFucyA9IDEgOwoKICAgICAgICBGT1IoaSwgMSwgIGxlbiApIHsKICAgICAgICAgICAgUkVQKGMsIHhbaV0gLSAnYScpIHsKICAgICAgICAgICAgICAgIGxsIG54dF9BID0gbnh0QVtraG9wQSArIDEgXVtjIF0gOwogICAgICAgICAgICAgICAgbGwgbnh0X0IgPSBueHRCW2tob3BCICsgMSBdW2NdIDsKICAgICAgICAgICAgICAgIGlmKGtob3BCID4gbSkgbnh0X0IgPSBraG9wQiA7CiAgICAgICAgICAgICAgICBpZihraG9wQSA+IG4pIG54dF9BID0ga2hvcEEgOwogICAgICAgICAgICAgICAgYW5zID0gYWRkKGFucywgRFAoaSArIDEsIG54dF9BLCBueHRfQiApKSA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGwgbnh0X0EgPSBueHRBW2tob3BBICsgMSBdW3hbaV0gLSAnYScgXSA7CiAgICAgICAgICAgIGxsIG54dF9CID0gbnh0QltraG9wQiArIDEgXVt4W2ldIC0gJ2EnIF0gOwogICAgICAgICAgICBpZihraG9wQiA+IG0pIG54dF9CID0ga2hvcEIgOwogICAgICAgICAgICBpZihraG9wQSA+IG4pIG54dF9BID0ga2hvcEEgOwogICAgICAgICAgICBraG9wQSA9IG54dF9BLCBraG9wQiA9IG54dF9CIDsKICAgICAgICB9CiAgICAgICAgY291dCA8PCBhbnMgPDwgZWwgOwogICAgfQp9CgpfUk9PVF8gewogICAgLy8gZnJlb3BlbihOQU1FIi5pbnAiICwgInIiICwgc3RkaW4pOwogICAgLy8gZnJlb3BlbihOQU1FIi5vdXQiICwgInciLCBzdGRvdXQpIDsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgY291dC50aWUoMCk7CiAgICBpbnQgdCA9IDE7IC8vIGNpbiA+PiB0IDsKICAgIHdoaWxlKHQtLSkgewogICAgICAgIGluaXQoKTsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgcmV0dXJuICgwJjApOwp9Cg==