//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<cmath>
#include<climits>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#include<set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define pb(a) push_back(a)
#define INF 0x1f1f1f1f
#define lson idx<<1,l,mid
#define rson idx<<1|1,mid+1,r
#define PI 3.1415926535898
template<class T> T min(const T& a,const T& b,const T& c) {
return min(min(a,b),min(a,c));
}
template<class T> T max(const T& a,const T& b,const T& c) {
return max(max(a,b),max(a,c));
}
void debug() {
#ifdef ONLINE_JUDGE
#else
freopen("d:\\in.txt","r",stdin);
// freopen("d:\\out1.txt","w",stdout);
#endif
}
int getch() {
int ch;
while((ch=getchar())!=EOF) {
if(ch!=' '&&ch!='\n')return ch;
}
return EOF;
}
struct BIG
{
int bit[15];
int len;
BIG(){len=1;bit[0]=0;}
BIG(int x){bit[0]=x;len=1;}
BIG one()
{
BIG res;
res.bit[0]=1;
return res;
}
BIG operator += (const BIG &ans)
{
int nlen=max(len,ans.len);
int next=0;
for(int i=0;i<nlen;i++)
{
int x=(i<len?bit[i]:0)+(i<ans.len?ans.bit[i]:0)+next;
next=x/1000000000;
bit[i]=x%1000000000;
}
len = nlen;
if(next)
bit[len++]=next;
return *this;
}
void output()
{
printf("%d",bit[len-1]);
for(int i=len-2;i>=0;i--)
printf("%09d",bit[i]);
// printf("\n");
}
};
const int MAX_NODE=222;
const int SIGMA_SIZE = 50;
int ch[MAX_NODE][SIGMA_SIZE];
int fail[MAX_NODE];
int val[MAX_NODE];
int sz;
int n,m,p;
BIG dp[MAX_NODE][55];
int vis[MAX_NODE][55];
int id[256];
void init(int n)
{
memset(id,-1,sizeof(id));
char buf[55];
scanf("%s",buf);
for(int i=0;i<n;i++)
id[buf[i]]=i;
sz=1;
memset(ch[0],0,sizeof(ch[0]));
val[0]=0;
}
void insert(const char *s)
{
int u=0;
for(int i=0;s[i]!='\0';i++)
{
int v=id[s[i]];
if(!ch[u][v])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][v]=sz++;
}
u=ch[u][v];
}
val[u]=1;
}
void construct()
{
fail[0]=0;
queue<int> q;
for(int c=0;c<SIGMA_SIZE;c++)
{
int u=ch[0][c];
if(u){fail[u]=0;q.push(u);}
}
while(!q.empty())
{
int r=q.front();q.pop();
for(int c=0;c<SIGMA_SIZE;c++)
{
int u=ch[r][c];
if(!u)
{
ch[r][c]=ch[fail[r]][c];
continue;
}
q.push(u);
int v=fail[r];
while(v&&!ch[v][c])v=fail[v];
fail[u]=ch[v][c];
val[u]|=val[fail[u]];
}
}
}
BIG f(int u,int k)
{
if(!k)return BIG(1);
if(vis[u][k])return dp[u][k];
vis[u][k]=1;
BIG x;
for(int c=0;c<n;c++)
{
if(!val[ch[u][c]])
{
BIG xx=f(ch[u][c],k-1);
// x.output();
// xx.output();
x+=xx;
// x.output();
//x+=f(ch[u][c],k-1);
}
}
return dp[u][k]=x;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
init(n);
for(int i=1;i<=p;i++)
{
char buf[55];
scanf("%s",buf);
insert(buf);
}
construct();
memset(vis,0,sizeof(vis));
BIG num=f(0,m);
num.output();
printf("\n");
}
return 0;
}