#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e6+5;
int n,m;
int s[maxn],t[maxn];
int vis[maxn],next[maxn];
int fs[maxn],ft[maxn];
const ull base = 1e6+1;
struct c_hash
{
ull p[maxn],hs[maxn];
void hash_tab(int a[],int len)
{
p[0]=1;hs[0]=0;
p[i]=p[i-1]*base;
hs[i]=hs[i-1]*base+a[i];
}
ull get_hash(int l,int r)
{
return hs[r]-p[r-l+1]*hs[l-1];
}
}S,T;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=m;i++) cin<<t[i];
//前驱
memset(vis,-1,sizeof vis);
for(int i=1;i<=n;i++)
{
if(vis[s[i]]==-1) fs[i]=n;
else fs[i]=1-vis[s[i]];
vis[s[i]]=i;
}
memset(vis,-1,sizeof vis);
for(int i=1;i<=m;i++)
{
if(vis[t[i]]==-1) ft[i]=n;
else ft[i]=1-vis[t[i]];
vis[t[i]]=i;
}
//后继
memset(vis,n+1,sizeof vis);
for(int i=n;i>0;i--)
{
next[i]=vis[s[i]];
vis[s[i]]=i;
}
//建立哈希表
S.hash_tab(fs,n);T.hash_tab(ft,m);
int ans=0;
ull res=T.get_hash(1,m),k=S.get_hash(1,m);
if(res==k) cou++;
for(int l=2,r=m+1;r<=n;l++,r++)
{
k=S.get_hash(l,r);
int x=next[l-1];
if(x<=r) now=now+(n-fs[x])*S.p[r-x];//r-x:(r-l+1)-(xx-l+1)
if(k==res) cou++;
}
cout<<cou<<endl;
return 0;
}