Problem:
Score : 500 points

Problem Statement

Given are two strings s and t consisting of lowercase English letters. Determine if there exists an integer i satisfying the following condition, and find the minimum such i if it exists.

Let s' be the concatenation of 10^{100} copies of s. t is a subsequence of the string {s'}_1{s'}_2\ldots{s'}_i (the first i characters in s').

Notes

A subsequence of a string a is a string obtained by deleting zero or more characters from a and concatenating the remaining characters without changing the relative order. For example, the subsequences of contest include net, c, and contest.

Constraints

1 \leq |s| \leq 10^5

1 \leq |t| \leq 10^5

s and t consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

s
t

Output

If there exists an integer i satisfying the following condition, print the minimum such i; otherwise, print -1.

Sample Input 1

contest
son

Sample Output 1

10

t = son is a subsequence of the string contestcon (the first 10 characters in s' = contestcontestcontest...), so i = 10 satisfies the condition.

On the other hand, t is not a subsequence of the string contestco (the first 9 characters in s'), so i = 9 does not satisfy the condition.

Similarly, any integer less than 9 does not satisfy the condition, either. Thus, the minimum integer i satisfying the condition is 10.

Sample Input 2

contest
programming

Sample Output 2

-1

t = programming is not a substring of s' = contestcontestcontest.... Thus, there is no integer i satisfying the condition.

Sample Input 3

contest
sentence

Sample Output 3

33

Note that the answer may not fit into a 32-bit integer type, though we cannot put such a case here.

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

  #include<bits/stdc++.h>
using namespace std;
using ll = long long;


#define debug(x) cout << #x << " = " << x << endl;
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define FOR(it, b, e) for (typeof(b) it = (b); it != (e); ++it)
#define MSET(c, v) memset(c, v, sizeof(c))

const int INF = 0x3F3F3F3F; 
const int NEGINF = 0xC0C0C0C0;
const int NULO = -1;
const double EPS = 1e-10;
const ll mod = 961748941;

inline int cmp(double x, double y = 0) 
{  
  if(fabs(x - y) < EPS)
    return 0;
  return x > y ? 1 : -1;
}

ll exp(ll a, ll b)
{
  ll ans = 1;
  while(b)
  {
    if(b & 1)
      ans = (ans * a) % mod;
    a = (a * a) % mod;
    b >>= 1;
  }
  return ans;
}

const int maxn = 2e5  + 5;
ll fat[maxn], inv[maxn];

ll C(int n, int k)
{
  if(n < k) 
    return 0;
  if(n < 0 || k < 0) 
    return 0;
  return (((fat[n] * inv[k]) % mod) * inv[n - k]) % mod;
}

void initFactorials()
{
  fat[0] = 1;
  inv[0] = 1;
  for(int i = 1; i < maxn; i++)
  {
    fat[i] = (i * fat[i-1]) % mod;
    inv[i] = exp(fat[i], mod - 2);
  }
}

int cnt[26];

set<int>q[26];

int main()
{
  ios::sync_with_stdio(0);
  string s;
  string t;
  cin >> s >> t;
  for(const auto &c : t)
    cnt[c - 'a']++;
  
  for(int i = 0 ; i < s.size(); i++)
  {
    if(q[s[i] - 'a'].size() + 1 <= cnt[s[i] - 'a'])
      q[s[i] - 'a'].insert(i + 1);
  }

  int last = 0;
  for(int i = 0 ; i < t.size(); i++)
  {
    int val = t[i] - 'a';
    if(q[val].size() == 0)
    {
      cout << "-1\n";
      return 0;
    }
    auto it = q[val].lower_bound(last);
    // cout << t[i] << ": ";
    // for(const auto &c : q[val])
    //   cout << c << ' ';
    // cout << endl; 
    if(it == q[val].end())
      it--;
    if(*it < last)
    {
      int x = (last - *it + s.size() - 1) / s.size();
      last = *it + x * s.size();
      q[val].erase(it);
      q[val].insert(last);
    }
    else
    {
      last = *it;
      q[val].erase(it);
      q[val].insert(last + s.size());
    }
    // cout << t[i] << ' ' << last << endl;
  }

  cout << last << endl;

  return 0;
}