#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char c[410000];
char S[51000];
char T[51000];
int rank[410000];
int tmp[410000];
int sa[410000];
int lcp[410000];
int N;
int k;
void construct_lcp(){
	for(int i=0;i<=N;i++)rank[sa[i]]=i;
	int h=0;
	lcp[0]=0;
	for(int i=0;i<N;i++){
		int j=sa[rank[i]-1];
		if(h)h--;
		for(;j+h<N&&i+h<N;h++){
			if(c[j+h]!=c[i+h])break;
		}
		lcp[rank[i]-1]=h;
	}
}
bool compare_sa(int i,int j){
	if(rank[i]!=rank[j])return rank[i]<rank[j];
	else{
		int ri=i+k<=N?rank[i+k]:-1;
		int rj=j+k<=N?rank[j+k]:-1;
		return ri<rj;
	}
}
void construct_sa(){
	for(int i=0;i<=N;i++){
		sa[i]=i;
		rank[i]=i<N?c[i]:-1;
	}
	for(k=1;k<=N;k*=2){
		sort(sa,sa+N+1,compare_sa);
		tmp[sa[0]]=0;
		for(int i=1;i<=N;i++){
			tmp[sa[i]]=tmp[sa[i-1]]+(compare_sa(sa[i-1],sa[i])?1:0);
		}
		for(int i=0;i<=N;i++){
			rank[i]=tmp[i];
		}
	}
}
int segtree[524288];
void update(int a,int b){
	a+=262144;
	while(a){
		segtree[a]=min(segtree[a],b);
		a/=2;
	}
}
int query(int a,int b,int c,int d,int e){
	if(d<a||b<c)return 99999999;
	if(c<=a&&b<=d)return segtree[e];
	return min(query(a,(a+b)/2,c,d,e*2),query((a+b)/2+1,b,c,d,e*2+1));
}
int sl[51000];
int sr[51000];
int tl[51000];
int tr[51000];
int sk[51000];
int tk[51000];
int UF[410000];
int ss[410000];
int ts[410000];
int FIND(int a){
	if(UF[a]<0)return a;
	return UF[a]=FIND(UF[a]);
}
void UNION(int a,int b){
	a=FIND(a);b=FIND(b);if(a==b)return;
	ss[a]+=ss[b];
	ts[a]+=ts[b];
	UF[a]+=UF[b];UF[b]=a;
}
pair<int,int>ev[410000];
pair<int,int>se[51000];
pair<int,int>te[51000];
int main(){
	scanf("%s%s",S,T);
	int at=0;
	int n=strlen(S);
	int m=strlen(T);
	for(int i=0;i<n;i++)c[at++]=S[i];
	c[at++]='~';
	for(int i=n-1;i>=0;i--)c[at++]=S[i];
	c[at++]='[';
	for(int i=0;i<m;i++)c[at++]=T[i];
	c[at++]='^';
	for(int i=m-1;i>=0;i--)c[at++]=T[i];
	N=at;
	construct_sa();
	construct_lcp();
	long long ret=0;
 
//ODD
 
	for(int i=0;i<N;i++){
		if(sa[i]<n){
			sl[sa[i]]=i;
		}else if(n+1<=sa[i]&&sa[i]<2*n+1){
			sr[n-1-(sa[i]-n-1)]=i;
		}else if(2*n+2<=sa[i]&&sa[i]<2*n+m+2){
			tl[sa[i]-2*n-2]=i;
		}else if(2*n+m+3<=sa[i]&&sa[i]<2*n+2*m+3){
			tr[m-1-(sa[i]-2*n-m-3)]=i;
		}
	}
	for(int i=0;i<524288;i++)segtree[i]=99999999;
	for(int i=0;i<N;i++){
		update(i,lcp[i]);
	}
//	for(int i=0;i<N;i++)printf("%d ",lcp[i]);printf("\n");
//	for(int i=0;i<n;i++)printf("%d %d\n",sl[i],sr[i]);
	for(int i=0;i<n;i++){
		sk[i]=query(0,262143,min(sl[i],sr[i]),max(sl[i],sr[i])-1,1);
	//	printf("%d: %d\n",i,sk[i]);
	}
	for(int i=0;i<m;i++){
		tk[i]=query(0,262143,min(tl[i],tr[i]),max(tl[i],tr[i])-1,1);
	}
	for(int i=0;i<n;i++)se[i]=make_pair(-sk[i],sl[i]);
	for(int i=0;i<m;i++)te[i]=make_pair(-tk[i],tl[i]);
	std::sort(se,se+n);
	std::sort(te,te+m);
	int sat=0;
	int tat=0;
	for(int i=0;i<N;i++)UF[i]=-1;
	for(int i=0;i<N-1;i++)ev[i]=make_pair(-lcp[i],i);
	std::sort(ev,ev+N-1);
	at=0;
	long long val=0;
 
	for(int i=401000;i>0;i--){
		while(at<N-1&&ev[at].first==-i){
			int L=FIND(ev[at].second);
			int R=FIND(ev[at].second+1);
			val+=(long long)ss[L]*ts[R]+(long long)ss[R]*ts[L];
			UNION(L,R);
			at++;
		}
		while(sat<n&&se[sat].first==-i){
			val+=ts[FIND(se[sat].second)];
			ss[FIND(se[sat].second)]++;
			sat++;
		}
		while(tat<m&&te[tat].first==-i){
			val+=ss[FIND(te[tat].second)];
			ts[FIND(te[tat].second)]++;
			tat++;
		}
		ret+=val;
	}
	//printf("%d %d %d %lld\n",at,sat,tat,ret);
 
// EVEN
 
	for(int i=0;i<N;i++){
		if(sa[i]&&sa[i]<n){
			sl[sa[i]-1]=i;
		}else if(n+1<sa[i]&&sa[i]<2*n+1){
			sr[n-1-(sa[i]-n-1)]=i;
		}else if(2*n+2<sa[i]&&sa[i]<2*n+m+2){
			tl[sa[i]-2*n-3]=i;
		}else if(2*n+m+3<sa[i]&&sa[i]<2*n+2*m+3){
			tr[m-1-(sa[i]-2*n-m-3)]=i;
		}
	}
	for(int i=0;i<524288;i++)segtree[i]=99999999;
	for(int i=0;i<N;i++){
		update(i,lcp[i]);
	}
	for(int i=0;i<n-1;i++){
		sk[i]=query(0,262143,min(sl[i],sr[i]),max(sl[i],sr[i])-1,1);
	}
	for(int i=0;i<m-1;i++){
		tk[i]=query(0,262143,min(tl[i],tr[i]),max(tl[i],tr[i])-1,1);
	}
	for(int i=0;i<n-1;i++)se[i]=make_pair(-sk[i],sl[i]);
	for(int i=0;i<m-1;i++)te[i]=make_pair(-tk[i],tl[i]);
	std::sort(se,se+n-1);
	std::sort(te,te+m-1);
	sat=0;
	tat=0;
	for(int i=0;i<N;i++)UF[i]=-1;
	for(int i=0;i<410000;i++)ss[i]=ts[i]=0;
	for(int i=0;i<N-1;i++)ev[i]=make_pair(-lcp[i],i);
	std::sort(ev,ev+N-1);
	at=0;
	val=0;
//	for(int i=0;i<n-1;i++)printf("%d %d\n",sl[i],sr[i]);
	for(int i=401000;i>0;i--){
		while(at<N-1&&ev[at].first==-i){
			int L=FIND(ev[at].second);
			int R=FIND(ev[at].second+1);
			val+=(long long)ss[L]*ts[R]+(long long)ss[R]*ts[L];
			UNION(L,R);
			at++;
		}
		while(sat<n-1&&se[sat].first==-i){
			val+=ts[FIND(se[sat].second)];
			ss[FIND(se[sat].second)]++;
			sat++;
		}
		while(tat<m-1&&te[tat].first==-i){
			val+=ss[FIND(te[tat].second)];
			ts[FIND(te[tat].second)]++;
			tat++;
		}//printf("%lld\n",val);
		ret+=val;
	}
 
	printf("%lld\n",ret);
}

Measured memory_bytes: 19900