#include<cstdio>
#include<string>
#include<utility>
#include<algorithm>

using namespace std;

typedef pair<int,int> P;

string S,T,str;
string revS,revT;

int rank[200200],tmp[200200];
int sa[200200];
int N,K;

bool cmp_sa(int i,int j){
	if(rank[i]!=rank[j]) return rank[i]<rank[j];
	int ri=i+K<=N?rank[i+K]:-1;
	int rj=j+K<=N?rank[j+K]:-1;
	return ri<rj;
}

void getSA(){
	N=str.size();
	for(int i=0;i<=N;i++){
		sa[i]=i;
		rank[i]=i<N?str[i]:-1;
	}
	for(K=1;K<=N;K*=2){
		sort(sa,sa+N+1,cmp_sa);
		tmp[sa[0]]=0;
		for(int i=1;i<=N;i++){
			tmp[sa[i]]=cmp_sa(sa[i-1],sa[i])?tmp[sa[i-1]]+1:tmp[sa[i-1]];
		}
		for(int i=0;i<=N;i++){
			rank[i]=tmp[i];
		}
	}
//	printf("sa=");
//	for(int i=0;i<N+1;i++) printf("%d ",sa[i]);
//	printf("\n");
}

int lcp[200200];
P lcp_[200200];

void getLCP(){
	getSA();
	int h=0;
	for(int i=0;i<N;i++){
		int j=sa[rank[i]-1];
		if(h>0) h--;
		for(;j+h<N&&i+h<N;h++){
			if(str[i+h]!=str[j+h]) break;
		}
		lcp[rank[i]-1]=h;
	}
//	printf("lcp=");
//	for(int i=0;i<N;i++) printf("%d ",lcp[sa[i]]);
//	printf("\n");
}

struct RmQ{
	int N;
	P dat[524288];
	int inf;
	void init(int N_){
		N=1;
		inf=1e8;
		while(N<N_) N*=2;
		for(int i=1;i<=N*2-1;i++) dat[i]=P(inf,inf);
	}
	void init(int N_,P *a){
		N=1;
		inf=1e8;
		while(N<N_) N*=2;
		for(int i=0;i<N_;i++) dat[i+N]=a[i];
		for(int i=N_;i<N;i++) dat[i+N]=P(inf,inf);
		for(int i=N-1;i>=1;i--) dat[i]=min(dat[i*2],dat[i*2+1]);
//		for(int i=1;i<=N*2-1;i++) printf("dat %d %d %d\n",i,dat[i].first,dat[i].second);
	}
	P get(int l,int r,int k,int a,int b){
		if(l<=a&&b<=r) return dat[k];
		if(r<=a||b<=l) return P(inf,inf);
		return min(get(l,r,k*2,a,(a+b)/2),get(l,r,k*2+1,(a+b)/2,b));
	}
	P get(int l,int r){
		return get(l,r,1,0,N);
	}
};

RmQ rmq;

struct UnionFind{
	int par[200200];
	int s0[200200],s1[200200],t0[200200],t1[200200];
	void init(int N){
		for(int i=0;i<N;i++){
			par[i]=i;
		}
	}
	int find(int x){
		if(par[x]==x) return x;
		return par[x]=find(par[x]);
	}
	void unite(int x,int y){
		x=find(x),y=find(y);
		if(x==y) return;
		if(x>y) swap(x,y);
		par[y]=x;
		s0[x]+=s0[y];
		s1[x]+=s1[y];
		t0[x]+=t0[y];
		t1[x]+=t1[y];
	}
	long long calc(int x){
		x=find(x);
		return (long long)s0[x]*t0[x]+(long long)s1[x]*t1[x];
	}
	void add(int id,int a,int b,int c,int d){
		id=find(id);
		s0[id]+=a;
		s1[id]+=b;
		t0[id]+=c;
		t1[id]+=d;
	}
};

UnionFind uf;

int s0[200200],s1[200200],t0[200200],t1[200200];

P ps[200200];

long long solve(){
	long long ans=0;
	revS=S;
	reverse(revS.begin(),revS.end());
	revT=T;
	reverse(revT.begin(),revT.end());
	str = S + '+' + revS + '-' + T + '*' + revT;
	getLCP();
//	for(int i=0;i<N;i++){
//		printf("%d %d\n",rank[i],lcp[rank[i]]);
//	}
	for(int i=0;i<N;i++) lcp_[i]=P(lcp[i],i);
	for(int i=0;i<N;i++) ps[i]=lcp_[i];
	rmq.init(N,lcp_);
//	for(int i=0;i<N;i++) printf("lcp_ %d %d\n",lcp_[i].first,lcp_[i].second);
	uf.init(N);
	for(int i=0;i<S.size();i++){
		int id1=i;
		int id2=S.size()*2-i;
		int pos1=rank[id1];
		int pos2=rank[id2];
		if(pos1>pos2) swap(pos1,pos2);
		P p=rmq.get(pos1,pos2);
		s0[p.second]++;
//		printf("%d %d\n",pos1,pos2);
//		printf("s0 %d\n",p.second);
	}
	for(int i=0;i+1<S.size();i++){
		int id1=i+1;
		int id2=S.size()*2-i;
		int pos1=rank[id1];
		int pos2=rank[id2];
		if(pos1>pos2) swap(pos1,pos2);
		P p=rmq.get(pos1,pos2);
		s1[p.second]++;
	}
	int x=S.size()*2+2;
	for(int i=0;i<T.size();i++){
		int id1=x+i;
		int id2=x+T.size()*2-i;
		int pos1=rank[id1];
		int pos2=rank[id2];
		if(pos1>pos2) swap(pos1,pos2);
		P p=rmq.get(pos1,pos2);
		t0[p.second]++;
//		printf("t0 %d\n",p.second);
	}
	for(int i=0;i+1<T.size();i++){
		int id1=x+i+1;
		int id2=x+T.size()*2-i;
		int pos1=rank[id1];
		int pos2=rank[id2];
		if(pos1>pos2) swap(pos1,pos2);
		P p=rmq.get(pos1,pos2);
		t1[p.second]++;
	}
	sort(ps,ps+N);
	reverse(ps,ps+N);
	for(int i=0;i<N;i++){
//		printf("(%d %d)\n",ps[i].first,ps[i].second);
		int x=ps[i].second;
		long long val=uf.calc(x)+uf.calc(x+1);
		uf.unite(x,x+1);
		uf.add(x,s0[x],s1[x],t0[x],t1[x]);
//		printf("(%d %d %d %d %d)\n",x,s0[x],s1[x],t0[x],t1[x]);
		long long val2=uf.calc(x);
		long long ad=val2-val;
		ans+=ad*ps[i].first;
//		printf("%lld %lld %lld %d\n",val2,val,ad,ps[i].first);
	}
	return ans;
}

char ch[50500];

int main(){
	scanf("%s",ch);
	S=ch;
	scanf("%s",ch);
	T=ch;
	long long ans=solve();
	printf("%lld\n",ans);
	return 0;
}

Measured memory_bytes: 20004