#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (long long i = a; i <= b; i++)
#define REP(i, n) for (long long i = 0; i < n; i++)
#define foreach(it, ar) for ( typeof(ar.begin()) it = ar.begin(); it != ar.end(); it++ )
#define fill(ar, val) memset(ar, val, sizeof(ar))
#define PI 3.1415926535897932385
#define uint64 long long
#define int64 long long
#define all(ar) ar.begin(), ar.end()
#define pb push_back
#define ff first
#define ss second
#define bit(n) (1<<(n))
#define Last(i) ( (i) & (-i) )
#define sq(x) ((x) * (x))
#define mp make_pair
#define pb push_back
#define MOD 1000000007
#define s arr[i]
string a , b, c, d;
vector<string> arr(4);
int nxt[4][50][26];
long long dp[50][50][50][50][26];
bool visit [ 50 ][50][50][50][26];
void precompute ()
{
for( int i = 0 ; i < 4 ; i ++ ) // Repeating for all strings
for ( int z = 0 ; z< 26 ; z++ ) // Repeating for all characters
for( int j = s.length() - 1 , idx = -1 ; j >= 0 ; j -- )
{
int ch = s[j]-'a' ;
if( ch == z )
idx = j ;
nxt[i][j][z] = idx ; // next occurance of zth character after index j in i-th string is = next[i][j][z] ;
}
}
long long rec ( int i , int j , int k , int l , int alp )
{
if( i == -1 || j == -1 || k == -1 || l == -1 )
return 0 ;
if( i >= arr[0].length() || j >= arr[1].length() || k >= arr[2].length() || l >= arr[3].length() )
return 0 ;
i = nxt[0][i][alp] ; j = nxt[1][j][alp] ; k = nxt[2][k][alp] ; l = nxt[3][l][alp] ;
if( i == -1 || j == -1 || k == -1 || l == -1 )
return 0 ;
if( visit[i][j][k][l][alp] )
return dp[i][j][k][l][alp];
int u1 = arr[0][i] - 'a';
int u2 = arr[1][j] - 'a';
int u3 = arr[2][k] - 'a';
int u4 = arr[3][l] - 'a';
if( u1 == alp && u2 == alp && u3 == alp && u4 == alp )
{
long long sum = 1;
for( int idx = 0 ; idx < 26 ; idx ++ )
{// cout<< nxt[0][i][idx] << nxt[1][j][idx] << nxt[2][k][idx] << nxt[3][l][idx]<<endl;
sum+=rec( i+1 , j+1 , k+1 , l + 1 , idx );
}
visit[i][j][k][l][alp] = true;
dp[i][j][k][l][alp] = sum ;
return sum ;
}
}
int main( )
{
// ios::sync_with_stdio( 0 );
// cin.tie(0);
for( int i = 0 ; i < 4 ; i ++ )
cin >> arr[i];
precompute();
long long sum = 0 ;
for( int i = 0 ; i < 26 ; i ++ )
sum += rec( 0 , 0, 0 ,0 , i );
cout<<sum<<endl;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIEZPUihpLCBhLCBiKSBmb3IgKGxvbmcgbG9uZyBpID0gYTsgaSA8PSBiOyBpKyspCiNkZWZpbmUgUkVQKGksIG4pIGZvciAobG9uZyBsb25nIGkgPSAwOyBpIDwgbjsgaSsrKQojZGVmaW5lIGZvcmVhY2goaXQsIGFyKSBmb3IgKCB0eXBlb2YoYXIuYmVnaW4oKSkgaXQgPSBhci5iZWdpbigpOyBpdCAhPSBhci5lbmQoKTsgaXQrKyApCiNkZWZpbmUgZmlsbChhciwgdmFsKSBtZW1zZXQoYXIsIHZhbCwgc2l6ZW9mKGFyKSkKI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzIzODUKI2RlZmluZSB1aW50NjQgbG9uZyBsb25nCiNkZWZpbmUgaW50NjQgbG9uZyBsb25nCiNkZWZpbmUgYWxsKGFyKSBhci5iZWdpbigpLCBhci5lbmQoKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZmIGZpcnN0CiNkZWZpbmUgc3Mgc2Vjb25kCiNkZWZpbmUgYml0KG4pICgxPDwobikpCiNkZWZpbmUgTGFzdChpKSAoIChpKSAmICgtaSkgKQojZGVmaW5lIHNxKHgpICgoeCkgKiAoeCkpCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBzIGFycltpXQpzdHJpbmcgYSAsIGIsIGMsIGQ7CnZlY3RvcjxzdHJpbmc+IGFycig0KTsKaW50IG54dFs0XVs1MF1bMjZdOwpsb25nIGxvbmcgZHBbNTBdWzUwXVs1MF1bNTBdWzI2XTsKYm9vbCB2aXNpdCBbIDUwIF1bNTBdWzUwXVs1MF1bMjZdOwp2b2lkIHByZWNvbXB1dGUgKCkKIHsKICAgZm9yKCBpbnQgaSA9IDAgOyBpICA8IDQgOyBpICsrICkgICAgLy8gUmVwZWF0aW5nIGZvciBhbGwgc3RyaW5ncwogICAgIGZvciAoIGludCB6ID0gMCA7IHo8IDI2IDsgeisrICkgICAvLyBSZXBlYXRpbmcgZm9yIGFsbCBjaGFyYWN0ZXJzCiAgICAgICAgZm9yKCAgaW50IGogPSBzLmxlbmd0aCgpIC0gMSAsIGlkeCA9IC0xICA7IGogID49IDAgOyBqIC0tICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICBpbnQgY2ggPSBzW2pdLSdhJyA7CgoKICAgICAgICAgICAgICAgaWYoIGNoICA9PSB6ICkKICAgICAgICAgICAgICAgICBpZHggPSAgaiA7CgogICAgICAgICAgICAgICAgbnh0W2ldW2pdW3pdICA9IGlkeCA7IC8vIG5leHQgb2NjdXJhbmNlIG9mIHp0aCBjaGFyYWN0ZXIgYWZ0ZXIgaW5kZXggaiBpbiBpLXRoIHN0cmluZyBpcyAgPSBuZXh0W2ldW2pdW3pdIDsKCgogICAgICAgICAgICB9CgoKIH0KCiBsb25nIGxvbmcgcmVjICggaW50IGkgLCBpbnQgaiAsICBpbnQgayAsICBpbnQgbCAsICBpbnQgYWxwICkKICAgIHsKICAgICAgICBpZiggaSA9PSAgLTEgfHwgaiA9PSAtMSB8fCBrID09IC0xIHx8IGwgPT0gLTEgKQogICAgICAgICAgICAgIHJldHVybiAwIDsKCiAgICAgICAgaWYoIGkgPj0gYXJyWzBdLmxlbmd0aCgpIHx8IGogPj0gYXJyWzFdLmxlbmd0aCgpIHx8IGsgPj0gIGFyclsyXS5sZW5ndGgoKSB8fCBsID49IGFyclszXS5sZW5ndGgoKSApCiAgICAgICAgICAgICAgcmV0dXJuIDAgOwoKICAgICAgICBpID0gbnh0WzBdW2ldW2FscF0gOyBqID0gIG54dFsxXVtqXVthbHBdIDsgayA9ICBueHRbMl1ba11bYWxwXSA7IGwgPSBueHRbM11bbF1bYWxwXSA7CgogICAgICAgICAgaWYoIGkgPT0gIC0xIHx8IGogPT0gLTEgfHwgayA9PSAtMSB8fCBsID09IC0xICkKICAgICAgICAgICAgICByZXR1cm4gMCA7CgogICAgICAgaWYoIHZpc2l0W2ldW2pdW2tdW2xdW2FscF0gKQogICAgICAgICAgcmV0dXJuIGRwW2ldW2pdW2tdW2xdW2FscF07CgogICAgICAgaW50IHUxID0gYXJyWzBdW2ldIC0gJ2EnOwogICAgICAgaW50IHUyID0gYXJyWzFdW2pdIC0gJ2EnOwogICAgICAgaW50IHUzID0gYXJyWzJdW2tdIC0gJ2EnOwogICAgICAgaW50IHU0ID0gYXJyWzNdW2xdIC0gJ2EnOwoKICAgICAgIGlmKCB1MSA9PSBhbHAgJiYgdTIgPT0gYWxwICYmIHUzID09IGFscCAmJiB1NCA9PSBhbHAgKQogICAgICAgIHsKICAgICAgICAgIGxvbmcgbG9uZyAgc3VtID0gMTsKICAgICAgICAgICBmb3IoIGludCAgaWR4ID0gMCA7IGlkeCAgPCAyNiA7IGlkeCArKyApCiAgICAgICAgICAgICB7Ly8gY291dDw8IG54dFswXVtpXVtpZHhdIDw8IG54dFsxXVtqXVtpZHhdIDw8ICBueHRbMl1ba11baWR4XSA8PCBueHRbM11bbF1baWR4XTw8ZW5kbDsKICAgICAgICAgICAgICAgc3VtKz1yZWMoIGkrMSAsIGorMSAsIGsrMSAgLCBsICsgMSAgLCBpZHggICk7CgogICAgICAgICAgICAgIH0KCgogICAgICAgICAgIHZpc2l0W2ldW2pdW2tdW2xdW2FscF0gPSB0cnVlOwogICAgICAgICAgIGRwW2ldW2pdW2tdW2xdW2FscF0gPSBzdW0gOwoKICAgICAgICAgICByZXR1cm4gc3VtICA7CgogICAgICAgIH0KCgogICAgfQoKaW50ICBtYWluKCApCnsKIC8vIGlvczo6c3luY193aXRoX3N0ZGlvKCAwICk7CiAvLyBjaW4udGllKDApOwogIGZvciggaW50IGkgPSAwIDsgaSAgPCA0IDsgaSArKyAgKQogICAgY2luID4+IGFycltpXTsKCgogICAgcHJlY29tcHV0ZSgpOwoKICAgbG9uZyBsb25nIHN1bSA9IDAgOwogICBmb3IoIGludCBpID0gMCA7IGkgPCAyNiA7IGkgKysgKQogICAgICBzdW0gKz0gcmVjKCAwICwgMCwgIDAgLDAgLCBpICk7CgoKICAgIGNvdXQ8PHN1bTw8ZW5kbDsKfQoK