#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <unordered_map>
#include <map>
#define int long long
inline int read()
{
int num=0,f=1;char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)num=(num<<3)+(num<<1)+(c^48),c=getchar();
return num*f;
}
inline int min(int a,int b){return a<b?a:b;}
char a[3005],b[3005];
std::unordered_map<unsigned long long,bool> hash;
int suf[26][3005];
inline int ins(int x)
{
if(hash[x-191]){return 0;}
hash[x-191]=1;
//puts("hey");
return 1;
}
signed main()
{
int n=read();
scanf("%s%s",a,b);
for(int i=0;i<n;i++)a[i]-=97;
for(int i=0;i<n;i++)b[i]-=97;
for(int i=0;i<26;i++)suf[i][n]=-1;
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<26;j++)
{
if(a[i]==j)suf[j][i]=i;
else suf[j][i]=suf[j][i+1];
}
}
int ans=0;
for(int i=0;i<n;i++)
{
unsigned int has=0,cur=0;
for(int j=i;j<n;j++)
{
has=has*53+b[j]+1;
has;
int f=suf[b[j]][cur];
if(f==-1)break;
cur=f+1;
ans+=ins(has);
//printf("[%lld %lld] has %lld\n",i,j,has);
}
}
printf("%lld\n",ans);
}
/*
20
egebejbhcfabgegjgiig
edfbhhighajibcgfecef
*/
//I want 100.
//stO zhoukangyang Orz
//oh no
// why it only got 80??
//zhoukangyang CCCCCCCCCCCCCCCCCCCCCOrz