#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
using namespace std;
namespace Yorihime_Nao{
template<class T> T MAX(T x,T y){
return x>y?x:y;
}
template<class T> T MIN( T x,T y){
return x<y?x:y;
}
template<class T,class ... Arg> T MAX(T x,T y,Arg ... arg){
return MAX(x>y?x:y,arg...);
}
template<class T,class ... Arg> T MIN(T x,T y,Arg ... arg){
return MIN(x<y?x:y,arg...);
}
template<class T> T lowbit(T x){
return x&-x;
}
template<class T> void SWAP(T &x,T &y){
x^=y^=x^=y;
return;
}
}
using namespace Yorihime_Nao;
const ll MAXN=3e6+5;
ll n,m;
char ch1[MAXN],ch2[MAXN],s[MAXN<<1],t[MAXN<<1];
ll tree[MAXN<<1],pi[MAXN<<1],b[MAXN<<1];
void update(ll x,ll delta){
while(x<=n){
tree[x]+=delta;
x+=lowbit(x);
}
return;
}
ll query(ll x){
ll res=0;
while(x){
res+=tree[x];
x-=lowbit(x);
}
return res;
}
void pre(char *txt){
ll len=strlen(txt+1),j=0;
pi[1]=0;
for(int i=2;i<=len;i++){
while(j&&txt[j+1]!=txt[i])j=pi[j];
if(txt[j+1]==txt[i])j++;
pi[i]=j;
}
return;
}
void kmp(char *word,char *txt){
ll j=0,len1=strlen(word+1),len2=strlen(txt+1);
for(int i=1;i<=len1;i++){
while(j&&word[i]!=txt[j+1])j=pi[j];
if(txt[j+1]==word[i])j++;
if(j==len2){
update(i-len2+1,1),j=pi[j];
}
}
return;
}
ll manacher(char *txt){
ll len=strlen(txt+1),ans=0;
for(int i=1,l=1,r=0;i<=len;i++){
ll k=i>r?1:MIN(b[l+r-i],r-i+1ll);
while(i-k>=1&&i+k<=len&&txt[i-k]==txt[i+k]){
if(i+k-m>i-k)ans+=query(i+k+1-m)-query(i-k-1);
k++;
}
b[i]=k--;
if(i+k>r)l=i-k,r=i+k;
}
return ans;
}
int main(){
cin>>n>>m;
cin>>(ch1+1)>>(ch2+1);
s[1]=t[1]='W';
for(int i=1;i<=n;i++)s[i<<1]=ch1[i],s[i<<1|1]='W';
n=n<<1|1;
for(int i=1;i<=m;i++)t[i<<1]=ch2[i],t[i<<1|1]='W';
m=m<<1|1;
pre(t);
kmp(s,t);
cout<<manacher(s);
return 0;
}