#include<fstream.h>
void constr (int v[1002], char a[1002][1002], int m)
{
int i,j;
for (i=1;i<=m;i++)
for (j=1;j<=m;j++)
v[a[i][j]-'a'+1]++;
}
void updtl (int v[1002], char a[1002][1002],int m, int p, int u)
{
int i;
for (i=1;i<=m;i++)
v[a[p][i]-'a'+1]--;
for (i=1;i<=m;i++)
v[a[u][i]-'a'+1]++;
}
void updtc (int v[1002], char a[1002][1002], int m, int p, int u, int l)
{
int i;
for (i=1;i<=m;i++)
v[a[l+i-1][p]-'a'+1]--;
for (i=1;i<=m;i++)
v[a[l+i-1][u]-'a'+1]++;
}
int main()
{
int i,j,n,m,nr=0,v[1002],v1[1002];
char ch,a[1002][1002];
ifstream f("matrix.in");
f>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
f>>a[i][j];
memset(v,0,27);
for (i=1;i<=m;i++)
for (j=1;j<=m;j++)
{
f>>ch;
v[ch-'a'+1]++;
}
f.close();
memset(v1,0,27);
for (i=1;i<=n-m+1;i++)
{
if (i==1) constr(v1,a,m);
else updtl(v1,a,m,i-1,m+i-1);
if (memcmp(v1,v,27)==0) nr++;
for (j=2;j<=n-m+1;j++)
{
updtc(v1,a,m,j-1,j+m-1,i);
if (memcmp(v1,v,27)==0) nr++;
}
}
ofstream g("matrix.out");
g<<nr;g.close();
return 0;
}