#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
inline void getstr(char s[],int&ls)
{
register char c=0;
while(!(c>='a' && c<='z'))
c=getchar();
ls=0;
while(c>='a' && c<='z')
s[++ls]=c,c=getchar();
s[ls+1]=0;
return;
}
#define CHARSET 26
char x[205050],y[205050];
int cnt,parent[405050],mxval[405050],ch[405050][CHARSET],last;
int right[405050];
inline int CreateNode(register int val=0)
{
cnt++,parent[cnt]=0,mxval[cnt]=val;
for(register int j=0;j<CHARSET;j++)
ch[cnt][j]=0;
return cnt;
}
inline int ExtendNode(register short c)
{
register int now=last,nw=CreateNode(mxval[last]+1);
right[nw]=1;
for(; now && !ch[now][c]; now=parent[now])
ch[now][c]=nw;
if(!now)
return parent[nw]=1,last=nw;
register int q=ch[now][c];
if(mxval[q] == mxval[now]+1)
return parent[nw]=q,last=nw;
register int b=CreateNode(mxval[now]+1);
for(register int j=0;j<CHARSET;j++)
ch[b][j]=ch[q][j];
parent[b]=parent[q],parent[q]=parent[nw]=b;
for(; now && ch[now][c]==q; now=parent[now])
ch[now][c]=b;
return last=nw;
}
long long ansum[405050],ans;
int bucket[405050],lst[405050];
inline void TopoSort()
{
for(register int i=1;i<=cnt;i++)
bucket[mxval[i]]++;
for(register int i=1;i<=cnt;i++)
bucket[i]+=bucket[i-1];
for(register int i=1;i<=cnt;i++)
lst[bucket[mxval[i]]--]=i;
for(register int i=cnt;i>=1;i--)
right[parent[lst[i]]]+=right[lst[i]];
for(register int i=2;i<=cnt;i++)
for(register int j=0;j<CHARSET;j++)
if(ch[lst[i]][j])
ansum[lst[i]]=ansum[parent[lst[i]]] \
+(long long)right[lst[i]]*(mxval[lst[i]]-mxval[parent[lst[i]]]);
}
int main()
{
int lx;getstr(x,lx);
int ly;getstr(y,ly);
last=CreateNode();
for(register int i=1;i<=lx;i++)
ExtendNode(x[i]-'a');
TopoSort();
register int now=1,len=0;
for(register int i=1;i<=ly;i++)
{
register short c=y[i]-'a';
if(ch[now][c])
len++,now=ch[now][c];
else
{
while(now && !ch[now][c])
now=parent[now];
if(!now)
now=1,len=0;
else
len=mxval[now]+1,now=ch[now][c];
}
ans+=ansum[parent[now]]+(long long)right[now]*(len-mxval[parent[now]]);
}
printf("%lld\n",ans);
return 0;
}