using namespace std;
int N,t,K;
string s[7],src;
int F[300][45],ps[300][300],le[7];
int Find(int x,int y)
{
int cr=0;
for (int i=x;i<=y;i++)
for (int j=1;j<=N;j++)
if (le[j]<=y-i+1){
bool bo=false;
for (int k=0;k<le[j];k++)
if (src[i+k]!=s[j][k]){
bo=true;
break;
}
if (!bo){
cr++;
break;
}
}
return cr;
}
int main()
{
// cin>>t;for (int sx=1;sx<=t;sx++){
cin>>N>>K;
src=" ";getchar();
for (int i=1;i<=N;i++){
getline(cin,s[1]);
src+=s[1];
}
cin>>N;
for (int i=1;i<=N;i++){
cin>>s[i];
le[i]=s[i].size();
}
memset(F,0,sizeof(F));
int len=src.size()-1;
for (int i=1;i<=len;i++) //先处理一下数据
for (int j=i;j<=len;j++)
ps[i][j]=Find(i,j);//i~j可以填有多少个单词
for (int i=1;i<=len;i++)
F[i][1]=ps[1][i];//把1~i为第一段时..
for (int k=2;k<=K;k++)//枚举把单词分成k份
for (int i=k;i<=len;i++)//枚举1~i分为k份时
for (int j=i;j>=k;j--)
if (F[i][k]<F[j-1][k-1]+ps[j][i])
F[i][k]=F[j-1][k-1]+ps[j][i];
cout<<F[len][K]<<endl;
// }
return 0;
}