/*
オーダー
10**6	余裕を持って間に合う	
10**7	おそらく間に合う	余裕を持って間に合う
10**8	非常にシンプルな処理でない限り厳しい	おそらく間に合う
10**9		非常にシンプルな処理でない限り厳しい
logn	:OK
n		:10^7
nlogn	:10^6
n**2	:10^4
n**3	:300
2**n	:20
n!		:10



// 各桁の和を計算する関数
int findSumOfDigits(int n) {
  int sum = 0;
  while (n > 0) { // n が 0 になるまで
    sum += n % 10;
    n /= 10;
  }
  return sum;
}

sort(a, a + N, greater<int>());  // a[0:N] を大きい順にソート

int num[110] = {0};  // バケット
for (int i = 0; i < N; ++i) {
    num[d[i]]++;  // d[i] が 1 個増える
}

map<string, int> mp; // 連想配列 map<キー型, 値型> オブジェクト名
for (int i = 0; i < N; ++i) {
    auto itr = mp.find(s[i]);        // s[i] が設定されているか？
    if(itr != mp.end() ) {
         mp[s[i]] += 1;
    }
    else {
         mp[s[i]] += 1 ;
    }
}
stack<int> s;	//intをデータとするスタックを用意
s.push(1);		//{} -> {1}
printf("%d\n", s.top());	// 3
s.pop();

queue<int> que;	//intをデータとするキューを用意
que.push(1);		//{} -> {1}
printf("%d\n", que.front());	// 1
que.pop();
*/

#include <iostream>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <bitset>
#include <string.h>
#include <fstream>

using namespace std;

// #define for(i,a,b) for (int i=(a);i<(b);++i)
typedef long long ll;
typedef pair<ll,ll> P;
#define REP(i,n) for(long long i = 0; i < (long long)(n); i++)
#define pb push_back // vectorに要素追加
#define INF (ll)1e18
 
vector<ll> s_idx[26]; //s_idx[アルファベットindex][s上のindex]
string abc = "abcdefghijklmnopqrstuwvxyz";
 
// 二分探索 drken
// https://qiita.com/drken/items/97e37dd6143e33a64c8c
// index が条件を満たすかどうか
bool isOK(ll i, ll index, ll key) {
    if (s_idx[i][index] >= key) return true;
    else return false;
}
 
// 汎用的な二分探索のテンプレ
ll binary_search(ll i, ll key) {
    ll left = -1; //「index = 0」が条件を満たすこともあるので、初期値は -1
    ll right = (ll)s_idx[i].size(); // 「index = a.size()-1」が条件を満たさないこともあるので、初期値は a.size()
 
    /* どんな二分探索でもここの書き方を変えずにできる！ */
    while (right - left > 1) {
        ll mid = left + (right - left) / 2;
 
        if (isOK(i, mid, key)) right = mid;
        else left = mid;
    }
 
    /* left は条件を満たさない最大の値、right は条件を満たす最小の値になっている */
    return right;
}
 

int main() {
	// 入力
    string s,t;
    cin>>s>>t;

    //解法
    REP(i,s.size()){//s上の各アルファベットの出現位置をvectorで記録
        REP(j,26){
            if (s[i]==abc[j]) s_idx[j].pb(i);
        }
    }
    
    // REP(i,26){//各アルファベットの出現位置をプリント
    //     printf("%c: ", abc[i]);
    //     REP(j,s_idx[i].size()){
    //         printf("%lld ", s_idx[i][j]);
    //     }
    //     printf("\n");
    // }

    ll t_index[t.size()]; // t_index[tのindex][アルファベットのindex]
    REP(i,t.size())t_index[i] = 0;
    REP(i,t.size()){
        REP(j,26){
            if (t[i]==abc[j]) t_index[i] = j;
        }
    }

    // REP(i, t.size()){//t_indexをプリント
    //     printf("%lld ", t_index[i]);
    // }
    // printf("\n");

    ll cycle = 0;
    ll phase = 0;
    ll ans = 0;
    REP(i, t.size()){//tの各文字についてs'上でのindexを調べる
        ll target = t_index[i];
        if (s_idx[target].size()==0){//探してるアルファベットがない場合
            ans = -1;
            break;
        }
        else{// t[i]に一致するsのindexを二分探索で探索
            ll index = binary_search(target, phase);
            if (index==s_idx[target].size()){//最後まで見つからない場合
                phase = s_idx[target][0]+1;
                cycle++;
            }
            else{//見つかった場合
                phase = s_idx[target][index]+1;
            }
        }
        // printf("i: %lld, cycle: %lld, phase: %lld\n", i, cycle, phase);//t[i]ごとの情報をプリント
    }
    if (ans!=-1){
        ans = s.size()*cycle + phase;
    }

    cout<<ans<<endl;
}


Measured memory_bytes: 2300